javascript - for var index in 与 forEach

标签 javascript loops for-loop iterator iteration

<分区>

在 javascript 中,如果我想遍历数组中的每个元素,我有几种方法可以做到这一点:

1.

for(var i =0; i<array.length; i++){}

2.

array.forEach(function(item, index){});

3.

for (var index in array){}

第一个是普通的,但是如果我觉得懒,我想用第二个或第三个。

但是我想知道它们之间有什么区别,在什么情况下应该选择哪个?

最佳答案

它们都是微妙不同的方法。

for(var i = 0; i<array.length; i++){}是行之有效的方法;感觉像 C,工作像 C。

  • 遍历每个数组索引,即使是那些没有对应属性/项的索引。
  • 适用于任何支持 .length 的对象和名称为 [0..length] 的属性;虽然它也适用于人口稀少的阵列,但可能需要额外的保护措施。
  • 不同于forEach , 这允许使用 continue/break/return以及在循环体内手动调整索引(如果需要的话)。

array.forEach(function(item, index){})是我更喜欢的方法,因为它通常就足够了,感觉更干净,并且是 "lazy" .

  • 遍历每个具有属性的数组值/索引。
  • 隐式暗示每个循环都有一个新的函数作用域。
  • 虽然是在 Array.prototype 上定义的,但它通常可以通过 call/apply 用于类似数组的对象。 .
  • 它有 more overhead than for..i++ (从 James G. 的评论中窃取的链接)。然而,这通常无关紧要,随着 body 所做功的增加,相对性能差异将减少

for (var index in array){} 不应在处理数组/序列迭代时使用


这是一个demonstration of some differences :

var array = [];
array[0] = 1;
array[2] = 2;  // Note that `1 in array` is false as it was never set
array.hello_world = 3;

var a = 0;
for(var i = 0; i<array.length; i++){
    a += array[i]
}
// -> NaN; because array[1] was undefined
console.log("index: " + a);

var b = 0;
array.forEach(function (v, i) {
    b += v;
});
// -> 3; because v was never undefined (as array[1] was skipped)
console.log("forEach: " + b);

var c = 0;
for (var p in array) {
    c += array[p];
}
// -> 6; picked up "hello_world" but didn't pick up missing "1" property
console.log("for..in: " + c); 

2 生成 different iteration order between browsers 的示例:

var a = [];
for (var i = 100000; i > 0; i -= 1000) { a[i] = i; }

var s = "";
for (var p in a) { s += p + ",";  }
console.log(s);

Chrome 和 IE 10 以递增的方式迭代; FF 按插入顺序迭代(对于较小范围的值,FireFox 也按数字升序排序)。只是不要使用这种方法来迭代序列,不会有任何这样的问题。

关于javascript - for var index in 与 forEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25775486/

相关文章:

javascript - 如何将 "Vary: Accept-Encoding" header 添加到 Amazon S3 上的文件中

java - 如何从给定的输入中标记一组行?

c - 遍历 C 中的多个数组

javascript - 将结果变量保留在 for 循环(Javascript)之外有什么区别?

javascript - 如何通过自定义属性获取另一个元素内元素内的文本

javascript - webpack 包中的导出顺序

javascript - 为什么验证函数不执行

java - 在 iframe 中搜索按钮

c++ - 更好地解释数组

r - 如何使用R中的条件/for循环将单列数据转换为两列矩阵