【问题标题】:Why does JavaScript not convert array-like objects to arrays?为什么 JavaScript 不将类似数组的对象转换为数组?
【发布时间】:2019-04-14 09:25:10
【问题描述】:

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

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

【问题讨论】:

  • 简短的回答是因为它们是 "array like" 的 DOM 对象。为什么它们不会自动成为 JS 数组完全基于意见。为什么会这样?

标签: javascript arrays type-conversion nodelist htmlcollection


【解决方案1】:

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

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

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

【讨论】:

  • 为什么投反对票。解释错误的评论将不胜感激。
  • 可能还会注意到,现代浏览器确实允许在 NodeList 对象上使用 forEach() 之类的方法,而无需进行数组转换。只是并非所有浏览器都支持,尤其是 IE
  • 讨厌社区? the 社区是什么?在我参与的任何社区中都不讨厌它。
  • @charlietfl 不知道 NodeList 对象允许 forEach()。谢谢!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-24
    • 2019-10-22
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2021-01-15
    相关资源
    最近更新 更多