开发者社区> 问答> 正文

读取数组的`length`属性真的在JavaScript中花费那么昂贵吗?

我一直认为在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引擎。

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

展开
收起
保持可爱mmm 2020-02-09 12:10:30 1001 0
1 条回答
写回答
取消 提交回答
  • 好吧,我本来会说这很昂贵,但是后来我在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的更多原因之一。

    2020-02-09 12:10:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript面向对象的程序设计 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载