Crockford 的 The Good Parts 一书告诉我,JavaScript 数组实际上是对象。
鉴于此,为什么这行不通? (我对它的期望很奇怪吗?)
arr={0:'a', 1:'b', 2:'c', 3:'d'}
Array.prototype.forEach.call(arr, function(el){console.log(el)})
我的想法:如果数组是对象,那么大概像 forEach
这样的方法会以键的升序循环遍历数组的属性。 (通过 call
,我们可以设置方法运行的 this
。)我假设这就是为什么 [].forEach.call(NodeList)
有效。
最佳答案
问题是您的对象没有 length
告诉 .forEach()
迭代多远。
这很重要,因为 JS 数组可以是稀疏的,所以它不能简单地检查属性是否存在来确定它是否应该退出,它只会继续递增,假设下一个索引可能有一个值。
因此,如果没有正确设置长度,迭代会在第一次比较时(或之前,我不记得了)失败。
在您的示例中,要将对象正确表示为类似数组的对象,它可能如下所示:
var arr={0:'a', 1:'b', 2:'c', 3:'d', length: 4}
现在 .forEach()
将成功迭代索引 0-3。
关于javascript - 在对象上调用 forEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41538780/