0

我知道在一个for-of循环中,可以使用该Array.entries()方法。正如概述的那样,这通常很好用 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries

但是,如果我尝试执行以下操作:

for (const [i, foo] of document.getElementsByClassName('foo').entries())
{
  console.log(`i = ${i}, foo = ${foo}`);
}

我被告知:

Uncaught TypeError: document.getElementsByClassName.entries is not a function or its return value is not iterable

我知道我可以使用一个很好的旧常规 for 循环......但是:

  • 为什么它不起作用?
  • 我是不是误会了什么?
  • 我可以让它按照我想要的方式工作(除了使用常规的 for 循环)吗?

我最好的猜测是 anHTMLCollection不是标准数组,因此没有这样的数字索引......

4

2 回答 2

1

Entries 方法可用于数组。但是,getElementsByClassName不返回数组。相反,它返回一个HTMLCollection. 您需要先将其转换为数组。有两种方法可以做到这一点:

  1. 使用Array.prototype.slice
function toArray(arr) {
  return Array.prototype.slice.call(arr);
}

toArray(document.getElementsByClassName('foo'));
  1. 使用 ES6 传播
function toArray(arr) {
  return [...arr];
}

toArray(document.getElementsByClassName('foo'));
于 2020-07-27T19:32:59.240 回答
0

getElementsByClassName不给数组,但是 NodeList

for (const [i, foo] of [].entries.call(document.getElementsByClassName('foo')))
{
  console.log(`i = ${i}, foo = `, foo);
}

于 2020-07-27T19:35:50.457 回答