可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to make a simple loop:
const parent = this.el.parentElement console.log(parent.children) parent.children.forEach(child => { console.log(child) })
But I get the following error:
VM384:53 Uncaught TypeError: parent.children.forEach is not a function
Even though parent.children logs:

What could be the problem?
Note: Here's a JSFiddle.
回答1:
The parent.children is an Array like object. Use the following solution:
const parent = this.el.parentElement; console.log(parent.children); Array.prototype.forEach.call(parent.children, child => { console.log(child) });
The parent.children is NodeList type, which is an Array like object because:
- It contains the
length property, which indicates the number of nodes - Each node is a property value with numeric name, starting from 0:
{0: NodeObject, 1: NodeObject, length: 2, ...}
See more details in this article.
回答2:
parent.children is not an array. It is HTMLCollection and it does not have forEach method. You can convert it to the array first. For example in ES6:
Array.from(parent.children).forEach(function (child) { console.log(child) });
or using spread operator:
[...parent.children].forEach(function (child) { console.log(child) });
回答3:
parent.children will return a node list, technically a html element Collection. That is an array like object, but not an array, so you cannot call array functions over it directly. At this context you can use Array.from() to convert that into a real array,
Array.from(parent.children).forEach(child => { console.log(child) })
回答4:
parent.children is a HTMLCollection which is array-like object. First, you have to convert it to a real Array to use Array.prototype methods.
const parent = this.el.parentElement console.log(parent.children) [].slice.call(parent.children).forEach(child => { console.log(child) })
回答5:
That's because parent.children is a NodeList, and it doesn't support the .forEach method (as NodeList is an array like structure but not an array), so try to call it by first converting it to array using
var children = [].slice.call(parent.children); children.forEach(yourFunc);
回答6:
A more naive version, at least your sure that it's work on all devise, without conversion and ES6 :
const children = parent.children; for (var i = 0; i < children.length; i++){ console.log(children[i]); }
https://jsfiddle.net/swb12kqn/5/
回答7:
Since you are using features of ES6 (arrow functions), you may also simply use a for loop like this:
for(let child of [{0: [{'a':1,'b':2},{'c':3}]},{1:[]}]) { console.log(child) }
回答8:
If you are trying to loop over a NodeList like this:
const allParagraphs = document.querySelectorAll("p");
I highly recommend loop it this way:
Array.prototype.forEach.call(allParagraphs , function(el) { // Write your code here })
Personally, I've tried several ways but most of them didn't work as I wanted to loop over a NodeList, but this one works like a charm, give it a try!
The NodeList isn't an Array, but we treat it as an Array, using Array. So, you need to know that it is not supported in older browsers!
Need more information about NodeList? Please read its documentation on MDN.
回答9:
There is no need for the forEach, you can iterate using only the from's second parameter, like so:
let nodeList = [{0: [{'a':1,'b':2},{'c':3}]},{1:[]}] Array.from(nodeList, child => { console.log(child) });