HTMLCollection 与 NodeList:深入理解它们的差异

在JavaScript中操作DOM(文档对象模型)时,你经常会遇到两种对象集合:HTMLCollectionNodeList。乍一看,它们似乎相似,但它们之间存在关键的差异。在本文中,我们将深入探讨这两种集合,探索它们的特点、相似之处和差异。

什么是HTMLCollection?

HTMLCollection 是DOM元素的实时集合。"实时"意味着如果DOM更新(例如,添加或删除元素),HTMLCollection 会自动更新以反映这些更改。

特点

  • 它是实时的,随DOM自动更新。
  • 它只包含元素节点。
  • 通常由 document.getElementsByClassName()element.children 等方法返回。

什么是NodeList?

NodeList 是DOM节点的集合。它可以是实时的或静态的,具体取决于它是如何获得的。例如,由 document.querySelectorAll() 返回的 NodeList 是静态的,而由 element.childNodes 返回的则是实时的。

特点

  • 可以是实时的或静态的。
  • 包含任何类型的节点(例如,元素节点、文本节点)。
  • 通常由 document.querySelectorAll()element.childNodes 等方法返回。

主要差异

  1. 节点类型HTMLCollection 只包含元素节点,而 NodeList 可以包含任何类型的节点。
  2. 实时与静态:所有的 HTMLCollections 都是实时的,这意味着它们会随DOM的更改自动更新。另一方面,NodeLists 可以是实时的或静态的,具体取决于它们是如何获得的。
  3. 可用方法:与 NodeList 相比,HTMLCollection 的API更为有限。例如,你不能直接在 HTMLCollection 上使用 forEach 等方法。

之间的转换

如果你需要将 HTMLCollection 转换为 NodeList,或反之,或者你想在它们上使用数组方法,你可以使用扩展语法或 Array.from() 将它们转换为数组:

const myCollection = document.getElementsByClassName('myClass');
const myArray = [...myCollection];
// 或
const myArray2 = Array.from(myCollection);

结论

理解 HTMLCollectionNodeList 之间的差异在JavaScript中操作DOM时至关重要。虽然它们看起来相似,但了解它们独特的特点可以确保你在应用程序中有效地遍历和操作DOM。始终记住它们的关键差异:它们可以包含的节点类型、它们的实时或静态特性以及它们可以使用的方法。


A Student on the way to full stack of Web3.