2014-10-03 40 views
1

我正在談論的重載編碼就像圖形或物理處理(非標準)那樣速度昂貴。直接分配數組和使用array.length

var a=[0,1,2,3,4,5,6,7,8,9]; 

當你問

console.log(a.lengh); 

難道比如使用一個被更新的變化或者是不是真的每次計數的正常變化,會發生什麼?

說,如果你有很多環上知道了這個

var i=flepdefloo; // some large number; 

var a2=[]; 

while(i--){ 
    a2[a2.length] = 'something'; 
    } 

應該a2.length緩存/手動加在一個單獨的VAR依賴?

+2

的價值每當數組發生變異時,就會計算'.length',而不是在訪問時(至少根據規範http://es5.github.io/#x15.4.5)。 – 2014-10-03 15:30:57

+0

'a2 [] ='something''是否會給出相同的結果? – 2014-10-03 15:32:39

+2

@Marc:在JS中拋出一個語法錯誤。這隻適用於PHP(afaik)。 – 2014-10-03 15:32:53

回答

3

只要數組發生了變異,而不是在訪問數組時,就會計算出.length的值。至少according to the specification

事實上,當我檢查在Chrome的財產,這是一個正常的數據屬性(不是getter或setter):

> Object.getOwnPropertyDescriptor([], 'length'); 
Object {value: 0, writable: true, enumerable: false, configurable: false} 

然而,還有其他方法將元素添加到一個數組。您可以使用.push

arr.push(value); 

你也可以用一個特定長度初始化數組,並與循環變量設置的值(這可能需要你改變你的循環):

var arr = new Array(length); 
// ... 
arr[i] = value; 
+0

好的答案,對象檢查是有見地的。 – 2014-10-03 15:42:39

0

大多數瀏覽器實際上是通過在編譯之前對代碼進行優化來爲您處理這個問題的。您可以測試這個自己:

http://jsperf.com/array-length-caching-test

也,你可能要考慮使用

a2.push("something"); 

使用本機的功能。