細說 Javascript 數組篇(一) : 數組的遍歷和 length 屬性

儘管數組在 Javascript 中是對象,可是不建議使用 for in 循環來遍歷數組,實際上,有不少理由來阻止咱們對數組使用 for in 循環。
由於 for in 循環將會枚舉原型鏈上的全部屬性,而且惟一阻止的方法是使用 hasOwnProperty 來判斷,這將比普通的 for 循環要慢很多。git

遍歷

爲了達到最佳性能來遍歷一個數組,最好的方式就是使用經典的 for 循環。github

var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i < l; i++) {
    console.log(list[i]);
}

這兒有一個額外的技巧,就是經過 l = list.length 來緩存數組的長度。
儘管屬性 length 是定義在數組自己的,可是在循環的每一次遍歷時仍然會有開銷。儘管最新的 Javascript 引擎可能已經對這種狀況做了性能上的優化,可是你並不能保證你的 Javascript 代碼會一直在這種瀏覽器上運行。
實際上,不緩存長度的循環要比緩存長度的循環性能上慢很多。數組

length 屬性

儘管 length 屬性僅僅經過 getter 方法返回數組中元素的個數,可是能夠經過 setter 方法來截斷數組。瀏覽器

var foo = [1, 2, 3, 4, 5, 6];
foo.length = 3;
foo; // [1, 2, 3]

foo.length = 6;
foo.push(4);
foo; // [1, 2, 3, undefined, undefined, undefined, 4]

length 屬性賦值一個更小的數將會截斷數組,若是賦值一個更大的數則不會截斷數組。緩存

總結

爲了性能達到最優,建議使用 for 循環而不是使用 for in 循環,同時緩存 length 屬性。ide

參考

http://bonsaiden.github.io/JavaScript-Garden/#array.general性能

相關文章
相關標籤/搜索