Javascript:(ES5)数组迭代的权威指南
Javascript: (ES5) Definitive guide to array iteration
关于如何在Javascript中"正确"迭代数组有很多困惑。至少有两个帖子获得了几百个赞成票,但答案非常矛盾。我很困惑。
ES5 添加了Array.prototype.forEach
功能。这是最终答案还是仍有陷阱需要避免介入?
如果有的话,请发布真正的一次迭代。我可以使用 ES5 如果您不知道自己在说什么,请不要发布。
简单的答案:如果你想避免不愉快的意外,就没有办法理解Javascript的对象模型,包括原型继承。Javascript Arrays基本上是具有一些附加属性的对象,它们与任何其他流行语言中的Arrays非常不同。
Array.prototype.forEach
,而且jquery.each
有一个更大的陷阱,而不仅仅是经常被建议不要使用的干净for (var k in a)
。我还没有在任何其他帖子中看到过这个陷阱。
看:
Array.prototype[2] = 'hi';
var a = [];
a.forEach(alert); // nothing
alert(a); // ''
a[3] = 3;
a.forEach(alert); // 'hi', then '3'
alert(a); // ',,hi,1'
这是怎么回事?请参阅 MDN 上符合规范的算法(在"兼容性"下),实现Array.prototype.forEach
。
a.forEach(myCallback)
或多或少相当于通常看到的
for (var p = 0, len = a.length; p < len; p++) {
if (p in a)
myCallback(a[p], p, a);
}
这意味着它也可以循环原型链中的属性!但只是以一种不太可靠的方式,因为它只循环满足p < len
的属性。
100%可靠的方法:
以下版本仅循环访问可枚举属性。可以使用 Object.getOwnPropertyNames
函数代替Object.keys
来包含不可枚举的属性。
数字、自己的、
顺序a.forEach(function(v, k, a) {
if (a.hasOwnProperty[k])
myCallback(v, k, a);
});
自己的,顺序的
Object.keys(a).sort(mySortFunc).forEach(function(k) {
myCallback(a[k], k, a);
});
数字,顺序
alert("Don't do it");
有
Object.keys(a).forEach(function(k) {
myCallback(a[k], k, a);
});
(无限制)
for (var k in a) {
myCallback(a[k], k, a);
}
我不认为最后一个是一个糟糕的选择。这是一种非常诚实和简洁的迭代方式。作为旁注,顺序数值迭代已被证明在大多数实现中具有性能优势,至少对于非稀疏数组是这样;但也许这不是规范的错。
- 如何在DataTables 2.1中迭代对象数组
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- 如何在Jquery中迭代JSON数组
- 为什么数组在对象内部迭代对象时存储重复值
- 迭代和修改Firebase数组会导致未定义
- 在对象上迭代以验证它是否's键存在于数组中
- 在JSON数组中进行迭代,并为其元素设置样式
- 我需要迭代一个JSON数组——不知道如何做到——已经搜索过了,但仍然可以'我一点也不知道
- JavaScript:如何在迭代过程中修改数组中的值
- 使用Ruby数组使用JS在视图中进行迭代和显示
- 使用javascript在数组中迭代和映射JSON
- 在数组中迭代时的JS循环位置
- 在可变长度d3的多维数组上迭代
- MVC:使用Web窗体视图引擎在javascript中迭代Viewbag数组
- 如何通过迭代对象数组来删除某些项目
- 如何在 JavaScript 中动态地编写可迭代的函数数组
- 使用节点在 JSON 数组中搜索项目(最好不迭代)
- 使用 promises/dedelay 异步迭代一组文件
- 不能让.offset()方法在迭代一组列表项时工作
- 迭代2个数组并找到匹配,但需要相同的索引