儘管數組在 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
屬性僅僅經過 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性能