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

Inconsistent results when using forEach and .shift()

本文关键字:结果 不一致 forEach shift 使用      更新时间:2023-09-26

所以这里有两个技巧:

Fiddle 1

Fiddle 2

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

因此,两者之间唯一的区别是:

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

与相比

for (var i = 0; i < testArray.length; i++) {
  var d = testArray.shift();
  jQuery('.js-target').append(d+'<br>');
}

对我来说,第一个应该和第二个一样有效。(通过推送将数据添加到testArray中,即添加到数组的末尾)。是不是我不理解shift函数?

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

shift方法删除第0个索引处的元素并进行移位连续索引处的值向下,然后返回删除的价值如果length属性为0,则返回undefined。

有关完整概述,请参阅MDN文档。

你可能想在MDN中阅读这个解释,它真的很好

以下示例记录"一"、"二"、"四"。当达到包含值"two"的条目时,整个数组的第一个条目将偏移,这将导致所有剩余条目向上移动一个位置因为元素"四"现在位于数组中较早的位置,所以将跳过"三"。forEach()在迭代之前不会生成数组的副本

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

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

来自MDN:

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