细说 Javascript 数组篇(一) : 数组的遍历和 length 属性

只管数组在 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 属性。

参考

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

    原文作者:StephenLee
    原文地址: https://segmentfault.com/a/1190000000492884
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞