javascript - 在对象上调用 forEach

标签 javascript arrays

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/

相关文章:

javascript - 数组中的非索引属性

php - 使用 while 循环将值添加到数组中

JavaScript 算法 - 比较两个字符串参数

c - 二进制和外部输入的无效操作数

javascript - 选择下一个函数

javascript - 为什么 dragstart 事件上的 preventDefault 会使元素保持选中状态?

javascript - 如何从元素定位直接子元素

javascript - 过滤数组并获取第一个值作为唯一 id 的对象数组

javascript - 如何使用 jQuery 仅突出显示选定的缩略图?

javascript - Chart.js 传递值数据动态