只管数组在 Javascript
中是对象,然则不发起运用 for in
轮回来遍历数组,实际上,有许多理由来阻挠我们对数组运用 for in
轮回。
由于 for in
轮回将会罗列原型链上的一切属性,而且唯一阻挠的要领是运用 hasOwnProperty
来推断,这将比一般的 for
轮回要慢不少。
遍历
为了到达最好机能来遍历一个数组,最好的体式格局就是运用典范的 for
轮回。
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
属性。