使用forEach和.shift()时的结果不一致

时间:2016-04-19 10:59:57

标签: javascript loops

所以这里有两个小提琴:

Fiddle 1

Fiddle 2

当在循环中使用forEach然后数组移位时,输出会产生重复,但如果我使用常规for循环并使用移位返回作为输出它可以正常工作。

所以两者之间的唯一区别是:

this.fs

与:相比:

var queueSize = testArray.length;

if (queueSize > 0) {
  testArray.forEach(function (loopData) {
    jQuery('.js-target').append(loopData+'<br>');
    testArray.shift();
  });
}

对我而言,第一个应该和第二个一样有效。 (数据通过push添加到testArray,即添加到数组的末尾)。这是我用移位功能不理解的东西吗?

3 个答案:

答案 0 :(得分:1)

shift方法将删除数组开头的元素。因此,第二个示例中的数组在每次迭代时都会缩短。

  

shift方法删除零点索引处的元素并移位   连续索引处的值下降,然后返回已删除的值   值。如果length属性为0,则返回undefined。

有关完整概述,请参阅the MDN docs

答案 1 :(得分:0)

如果在forEach循环期间更改数组的元素(而不是它们的值),它将与常规for循环的行为不同。

From MDN:

  

forEach()处理的元素范围在第一个之前设置   调用回调。之后附加到数组的元素   回调不会访问对forEach()开始的调用。如果   更改数组的现有元素的值,传递值   回调将是forEach()访问它们时的值;   访问之前删除的元素不会被访问。

答案 2 :(得分:0)

您可能想在MDN中阅读此explanation,真的很棒

下面的示例记录“一个”,“两个”,“四个”。当到达包含值“两个”的条目时,整个数组的第一个条目将移开,这将导致所有其余条目向上移动一个位置。 由于元素“四个”现在位于数组中的较早位置,因此将跳过“三个”。 forEach()在迭代之前不会复制数组。

var words = ['one', 'two', 'three', 'four'];
words.forEach(function(word) {
  console.log(word);
  if (word === 'two') {
    words.shift();
  }
});
// one
// two
// four