2012-08-06 87 views
1

在执行for-loop之前用另一个变量的长度声明变量或在循环内计算长度是否更有效?将变量设置为变量或计算循环中的长度

我确定答案取决于数组有多大,长度正在计算上。我只是总是看到

for (var i = 1; i <= theVar.length; i++) { 

} 

但后来我被告知,这是资源较少做

var theVarLen = theVar.length 

for (var i = 1; i <= theVarLen; i++) { 

} 

,因为它避免了每次迭代的长度重新计算。

或者这是否取决于具体情况这么多,不可能做出绝对法令?

或者,它真的不重要..?

感谢一大堆!

+0

测试它:http://jsperf.com。但长话短说,长度不会重新计算,它是一个固定的值,每当数组发生变化时都会更新。根据迭代的次数(' - >'数组的长度),您可以保存每次迭代的一次属性查找,这实际上可以有所作为。 – 2012-08-06 00:03:43

+1

可能重复[正在读取数组的'length'属性真的很贵的JavaScript操作?](http://stackoverflow.com/questions/5752906/is-reading-the-length-property-of-an -array-really-that-expensive-an-operation) – 2012-08-06 00:07:26

+0

作为一个便笺,我看到它也以这种方式做了很多:'for(var i = 0,len = a.length; i 2012-08-06 00:08:05

回答

3

好吧,让我们来看看。我在这里创建了一个测试,您可以运行:http://jsperf.com/loop-length-caching

浏览器似乎在创建(或可能修改)数组后将数组长度存储起来,因此,将长度存储在变量中并没有巨大的速度优势。唯一真正的因素(在这种情况下)是访问对象的属性和访问变量之间的速度差异。

+4

每次访问'.length时,**的长度都不会重新计算。 '。 – 2012-08-06 00:07:58

+0

这就是我的想法。但从测试来看,缓存的速度似乎将循环速度提高了约20%。如果它以任何方式缓存,为什么会有速度差异? – Blender 2012-08-06 00:09:28

+0

属性访问比访问变量慢。请参阅:http://jsperf.com/loop-length-caching/2 – 2012-08-06 00:12:33

0

可以说,这是一个内部取消引用的少一个指针,但我从来没有,有史以来看到它在真正的代码中的第二种方式完成。我相信你会很难为你获得的任何表现辩护。