1

在学习 DOM 操作时,我注意到诸如 getElementByTagName 或 querySelectorAll 之类的 Document 方法返回 HTMLCollection 或 NodeList 对象,无论它们看起来多么像数组,如果我们希望这些集合具有非常有用的数组方法。我想知道为什么会这样。JS没有自动将这些集合转换为数组有什么特别的原因吗?

编辑:我注意到NodeList在所有主要浏览器中都有forEach() 。

4

2 回答 2

1

DOM 集合有自己的类型,而不是 Array(或至少是数组子类)实例,因为它们与数组非常不同。它们只是DOM 上的视图,它们不是存储元素本身的容器。它们是不可变的(即你不能.push()在它们上)甚至是实时视图(即它们总是代表文档当前状态下的选择)。它们也只能保存 DOM 节点,不能像插入数组那样在其中放入任意值。

当然,它们是类似数组的,因为它们具有索引属性和 a .length,但这就是相似性结束的地方。.item(index)请注意,根据您将使用该方法的与语言无关的纯 DOM,只有 JavaScript 允许您使用索引属性访问内容。Array这就是为什么 DOM 集合有自己的层次结构并且与JavaScript 中内置的类型无关。

于 2018-11-11T14:23:09.340 回答
-3

您希望类似数组的 DOM 对象可以隐式转换为数组。Javascript 是一种非常动态的语言,可以自动执行许多此类转换。这也是这种语言在社区中如此讨厌的原因之一。例如:1 == "1"在 Javascript 中返回 true。

所以你提出的问题是确定我们应该在哪里划线的古老问题。

正如您自己指出的那样,您需要做的就是调用以Arrays.from获取实际数组。

于 2018-11-11T13:06:47.660 回答