当前位置: 首页 > 面试题库 >

读取数组的`length`属性真的在JavaScript中花费那么大的代价吗?

乜清野
2023-03-14
问题内容

我一直认为在JavaScript中缓存数组的长度是一个好主意(尤其是在for循环条件下),因为计算数组长度的代价很高。

for (var i = 0; i < arr.length; i++) { }

// vs

for (var i = 0, arrLength = arr.length; i < arrLength; i++) { }

但是,我认为也许length只有在创建和更改数组时才更新该属性。因此,与读取存储在变量中的操作相比,读取它的操作应该不会太昂贵(与其他语言的其他方法相对,后者可能需要在内存中寻找内容的结尾,例如strlen()在C语言中)。

我有两个问题。我也对它的工作方式感兴趣,所以请不要用 过早的优化工具 打我。

假设浏览器中的JavaScript引擎。

  1. length在JavaScript中缓存数组的属性有什么好处吗?在读取对象属性的局部变量时还有更多的事情吗?
  2. length属性是否仅在创建时以及在不返回新数组的on shift()pop()type方法上进行了更改,否则仅存储为整数?

问题答案:

好吧,我本来会说这很昂贵,但是后来我在jsperf.com上写了一个小测试,令我惊讶的i<array.length是,在Chrome中使用它的速度实际上更快,而在FF(4)中则没关系。

我怀疑长度存储为整数(Uint32)。根据ECMA规范(第262版,第5页,第121页):

每个Array对象都有一个length属性,该属性的值始终是小于2
32的非负整数。length属性的值在数值上大于名称为数组索引的每个属性的名称;每当创建或更改Array对象的属性时,都会根据需要调整其他属性以保持该不变性。具体地说,每当添加一个名称为数组索引的属性时,如果需要,将length属性更改为比该数组索引的数值大一的值;并且只要更改length属性,就会自动删除名称为数组索引且其值不小于新长度的每个属性。此约束仅适用于Array对象自身的属性,不受长度或数组索引属性(可能从其原型继承的属性)的影响

!我不知道我是否习惯过这种语言…

最后,我们总是有落后的浏览器。在IE(9,8,7)中,缓存的长度确实更快。我说,不使用IE的更多原因之一。



 类似资料:
  • 本文向大家介绍浅析javascript中function 的 length 属性,包括了浅析javascript中function 的 length 属性的使用技巧和注意事项,需要的朋友参考一下 [1,2,3].length  可以得到 3, "123".length  也可以得到 3,这个略懂js的都知道。 但是  eval.length,RegExp.length,"".toString.le

  • 问题内容: 当我尝试使用Promise从AngularUI-Bootstrap获取typeahead值时,出现以下错误。 我的HTML标签是: 用我的功能执行以下操作: 我不明白AngularUI- Bootstrap抱怨什么是不确定的。如果我删除最顶部的注释,则这些值会很好显示。中的输出还返回数组中我期望的所有值。 我缺少什么会导致AngularUI-Bootstrap看不到返回的数组? 问题答

  • (节点:55028)UnhandledPromiserEjectionWarning:TypeError:无法读取位于/users/PatrickStanciu/WebStormProjects/AUTISMAssistant/Backend/API/Controllers/PaymentsController.js:1045:34 位于processTicksAndRejections(inte

  • 问题内容: 我们可以使用它的方法确定的长度,例如 同样,我们可以使用属性确定对象的长度 方法是在类内部定义的,而此属性的定义在哪里? 问题答案: 数组是在Java中的特殊对象,他们有一个名为一个简单的属性是。 没有数组的“类定义”(你无法在任何.class文件中找到它),它们是语言本身的一部分。 10.7。数组成员 数组类型的成员都是以下所有: 的字段,其中包含所述阵列的部件的数量。可以是正数或零

  • 本文向大家介绍JavaScript中length属性的使用方法,包括了JavaScript中length属性的使用方法的使用技巧和注意事项,需要的朋友参考一下  此属性返回字符串中的字符数。 语法 下面是参数的详细信息:     A string 返回值: 返回字符串中的字符数。 例子: 这将产生以下结果:

  • 本文向大家介绍Javascript学习笔记之数组的遍历和 length 属性,包括了Javascript学习笔记之数组的遍历和 length 属性的使用技巧和注意事项,需要的朋友参考一下 尽管数组在 Javascript 中是对象,但是不建议使用 for in 循环来遍历数组,实际上,有很多理由来阻止我们对数组使用 for in 循环。 因为 for in 循环将会枚举原型链上的所有属性,并且唯一