Javascript:(ES5)数组迭代的最终指南
关于如何在Javascript中“正确”地迭代数组,有很多困惑。至少有两个帖子有几百张赞成票,但答案非常矛盾。我很困惑 ES5添加了Javascript:(ES5)数组迭代的最终指南,javascript,ecmascript-5,Javascript,Ecmascript 5,关于如何在Javascript中“正确”地迭代数组,有很多困惑。至少有两个帖子有几百张赞成票,但答案非常矛盾。我很困惑 ES5添加了Array.prototype.forEach函数。这是最终的答案还是仍有陷阱可以避免介入 如果有一个迭代,请发布一个真正的迭代。如果您不知道自己在说什么,我可以使用ES5 Don't post。简单的回答:如果您想避免令人不快的意外,就无法理解Javascript的对象模型,包括原型继承。Javascript数组基本上是具有一些附加属性的对象,它们与任何其他流行语
Array.prototype.forEach
函数。这是最终的答案还是仍有陷阱可以避免介入
如果有一个迭代,请发布一个真正的迭代。如果您不知道自己在说什么,我可以使用ES5 Don't post。简单的回答:如果您想避免令人不快的意外,就无法理解Javascript的对象模型,包括原型继承。Javascript数组基本上是具有一些附加属性的对象,它们与任何其他流行语言中的数组都非常不同
Array.prototype.forEach
和jquery。每一个都有一个比(a中的var k)
的干净更大的陷阱,这通常被建议不要使用。我没有在其他帖子中提到过这个陷阱
看:
这里发生了什么事?请参阅(在“兼容性”下)实现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);
}
自己的,顺序的
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");
数字、顺序的
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);
});
(无限制)
我不认为最后一个是个糟糕的选择。这是一种非常诚实和简洁的迭代方式。作为旁注,序列数值迭代已被证明在大多数实现上具有性能优势,至少对于非稀疏阵列是如此;但也许这不是规范的错。Array.prototype[2]='hi'
是一种非常奇怪的边缘情况,它似乎不是避免使用非常好的Array.prototype.forEach
函数的理由。如果你要担心这一点,你还必须避免一些
,每一个
,映射
,过滤器
,等等。从另一个角度来看,如果我要以这种方式向原型添加元素,那么我可能希望forEach
对其进行迭代。@torazaburo:你没有明白我的意思。你所说的(“…然后我可能想对它进行迭代”)正是我不明白(x in y)
的有什么错的原因。这两种迭代类型(包括或不包括原型属性)都有其有效的用途。但是,“只有在我们拥有比它的属性更大的任何数值原型属性”,“<代码>前缀 >的行为可能没有用处,并且我认为它是一个不可靠的错误特性,它在任何地方都没有被记录(并且可能没有在规范中考虑),是的,它通常是数字键古怪的。我之前的评论措辞不准确,我将删除它。“真正的一次迭代”只是(;;)
,简单而快速。