为什么 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
类型无关的原因
在了解 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
类型无关的原因