2012-08-06 86 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

可以說,這是一個內部取消引用的少一個指針,但我從來沒有,有史以來看到它在真正的代碼中的第二種方式完成。我相信你會很難爲你獲得的任何表現辯護。