forEach 不是 JavaScript 数组的函数错误

IT技术 javascript ecmascript-6 vue.js
2021-02-20 23:08:59

我正在尝试做一个简单的循环:

const parent = this.el.parentElement
console.log(parent.children)
parent.children.forEach(child => {
  console.log(child)
})

但我收到以下错误:

VM384:53 未捕获的类型错误:parent.children.forEach 不是函数

即使parent.children日志:

在此处输入图片说明

可能是什么问题呢?

注意:这是一个JSFiddle

6个回答

第一个选项:间接调用 forEach

parent.children是像对象的数组。使用以下解决方案:

const parent = this.el.parentElement;

Array.prototype.forEach.call(parent.children, child => {
  console.log(child)
});

parent.childrenISNodeList类型,就像对象,因为数组:

  • 它包含length表示节点数属性
  • 每个节点都是一个带有数字名称的属性值,从 0 开始: {0: NodeObject, 1: NodeObject, length: 2, ...}

请参阅本文中的更多详细信息


第二种选择:使用可迭代协议

parent.children是一个HTMLCollection:它实现了可迭代协议在 ES2015 环境中,您可以将HTMLCollection与任何接受迭代的构造一起使用

使用HTMLCollection与传播operatator:

const parent = this.el.parentElement;

[...parent.children].forEach(child => {
  console.log(child);
});

或者使用for..of循环(这是我的首选):

const parent = this.el.parentElement;

for (const child of parent.children) {
  console.log(child);
}
当我使用你的解决方案时,我不再有问题,但匿名函数中的代码没有执行。。所以..
2021-04-16 23:08:59
您使用哪个浏览器,以便 parent.children 告诉您它是一个 nodeList。在 Firefox 上,它告诉我是一个 HTMLCollection。如果它是一个 nodeList,.forEach() 会起作用
2021-05-02 23:08:59

parent.children不是数组。它是 HTMLCollection 并且它没有forEach方法。您可以先将其转换为数组。例如在 ES6 中:

Array.from(parent.children).forEach(child => {
    console.log(child)
});

或使用扩展运算符:

[...parent.children].forEach(function (child) {
    console.log(child)
});
Array.from(selected_rows).forEach(item => console.log(item));在我的情况下使用过并且有效
2021-04-17 23:08:59
这个答案是 OPs 问题的(之一)正确答案。parent.children 是一个没有 .forEach 方法的 HTMLCollection
2021-04-30 23:08:59
我更喜欢这个解决方案,而不是搞乱 Array 原型。
2021-05-14 23:08:59

一个更天真的版本,至少你确定它可以在所有设备上运行,无需转换和 ES6:

const children = parent.children;
for (var i = 0; i < children.length; i++){
    console.log(children[i]);
}

https://jsfiddle.net/swb12kqn/5/

这是更好的解决方案 tbh。它与其他编程语言很接近,并且出现奇怪的 JS 怪异现象的机会更少。它很简单,没有时髦的东西
2021-04-24 23:08:59
被点赞是因为所有这些新的 ES6 函数都在做与 JS 一样的旧功能,但以一种凌乱的方式
2021-05-06 23:08:59

parent.children将返回一个节点列表列表,技术上是一个html Collection那是一个类似对象的数组,但不是数组,因此您不能直接调用数组函数。在这种情况下,您可以将Array.from()其转换为真正的数组,

Array.from(parent.children).forEach(child => {
  console.log(child)
})
不,parent.children 不返回 nodeList 而是一个 HTML 集合。不是一回事。如果它是一个 nodeList,.forEach 会工作
2021-04-17 23:08:59

parent.children是一个HTMLCollection类似数组的对象。首先,您必须将其转换为 realArray才能使用Array.prototype方法。

const parent = this.el.parentElement
console.log(parent.children)
[].slice.call(parent.children).forEach(child => {
  console.log(child)
})
@DmitriyLoskutov 你不需要转换它 - JavaScript 是一种鸭子类型语言。只需使用此功能。
2021-04-22 23:08:59
有很多方法可以将类数组对象转换为数组 :) 这是其中之一
2021-05-02 23:08:59
或者不转换它,而是在 .forEach() 上使用 use .call()?
2021-05-06 23:08:59
@nnnnnn 请参阅下面的答案。
2021-05-06 23:08:59