为什么JavaScript无法将类似数组的对象转换为数组?

时间:2018-11-11 12:50:56

标签: javascript arrays type-conversion nodelist htmlcollection

在学习DOM操作时,我注意到诸如getElementByTagName或querySelectorAll之类的Document方法返回HTMLCollection或NodeList对象,尽管它们看起来很像数组,但如果我们希望将这些集合转换为数组,则必须使用Arrays.from()转换为数组。有非常有用的数组方法。我想知道为什么会这样。 JS没有自动将这些集合转换为数组的任何特殊原因吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-3)

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

因此,您提出的问题是确定我们应该在哪里划清界限的古老问题。

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