使用forEach和.shift()时结果不一致
Inconsistent results when using forEach and .shift()
所以这里有两个技巧:
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()访问它们时的值;在被访问之前被删除的元素不会被访问。
相关文章:
- 使用forEach和.shift()时结果不一致
- 将base64图像数据作为src分配给图像时,Firefox和Chrome上的结果不一致
- Meteor SmartCollection给出不一致的结果
- 返回不一致结果的日期(取决于是否存在前导零)
- Jasmine 测试在测试运行中、Firefox/Chrome 之间以及检查器开/关时的结果不一致
- 为什么结果与此装饰函数中的预期不一致
- 使用边界放置搜索请求,结果不一致
- 比较Javascript中的日期-结果不一致
- 为什么这种排序算法会在浏览器之间产生不一致的结果
- Jquery排序结果不一致
- 由于异步表单提交,结果不一致
- Javascript通配符regex搜索结果不一致
- 为什么使用按钮或Div运行查询会返回不一致的结果?
- Firefox 3.6.20 regex给出不一致的结果
- jQuery UI -多个自动完成-不一致的结果
- Javascript所见即所得文本区域插件在不同浏览器中产生不一致的结果
- 不一致的HTML5画布结果
- mongo结果与唯一字段不一致
- 不一致的 getTimezoneOffset 结果
- PHP密码哈希算法结果与Javascript结果不一致