Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:(ES5)数组迭代的最终指南_Javascript_Ecmascript 5 - Fatal编程技术网

Javascript:(ES5)数组迭代的最终指南

Javascript:(ES5)数组迭代的最终指南,javascript,ecmascript-5,Javascript,Ecmascript 5,关于如何在Javascript中“正确”地迭代数组,有很多困惑。至少有两个帖子有几百张赞成票,但答案非常矛盾。我很困惑 ES5添加了Array.prototype.forEach函数。这是最终的答案还是仍有陷阱可以避免介入 如果有一个迭代,请发布一个真正的迭代。如果您不知道自己在说什么,我可以使用ES5 Don't post。简单的回答:如果您想避免令人不快的意外,就无法理解Javascript的对象模型,包括原型继承。Javascript数组基本上是具有一些附加属性的对象,它们与任何其他流行语

关于如何在Javascript中“正确”地迭代数组,有很多困惑。至少有两个帖子有几百张赞成票,但答案非常矛盾。我很困惑

ES5添加了
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)
有什么错的原因。这两种迭代类型(包括或不包括原型属性)都有其有效的用途。但是,“只有在我们拥有比它的属性更大的任何数值原型属性”,“<代码>前缀 >的行为可能没有用处,并且我认为它是一个不可靠的错误特性,它在任何地方都没有被记录(并且可能没有在规范中考虑),是的,它通常是数字键古怪的。我之前的评论措辞不准确,我将删除它。“真正的一次迭代”只是(;;)
,简单而快速。