可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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) });