为什么 JavaScript 不将类数组对象转换为数组?

Why does JavaScript not convert array-like objects to arrays?

在了解 DOM 操作时,我注意到 getElementByTagName 或 querySelectorAll return HTMLCollection 或 NodeList 对象等文档方法,无论它们看起来多么像数组,都必须使用 Arrays.from() 如果我们想让这些集合拥有非常有用的数组方法。我想知道为什么会这样。 JS不自动将这些集合转为数组有什么特别的原因吗?

编辑:我注意到在所有主流浏览器中 NodeList has forEach()

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

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

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

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

当然,它们类似于数组,因为它们具有索引属性和 .length,但相似之处仅此而已。请注意,只有 JavaScript 允许您访问具有索引属性的内容,根据纯语言不可知 DOM 您将使用 .item(index) 方法。这就是为什么 DOM 集合拥有自己的层次结构并且与 JavaScript.

中内置的 Array 类型无关的原因