面试官:你知道 HTMLCollection 和 NodeList 的区别是什么?

284 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

🍕前言

看到这个题我们首先需要知道 HTMLCollection NodeList 是什么?

HTMLCollection 接口表示一个包含了元素(元素顺序为文档流中的顺序)的通用集合(generic collection),还提供了用来从该集合中选择元素的方法和属性。

NodeList 对象是一个节点的集合,是由 Node.childNodesdocument.querySelectorAll 返回的。NodeList不是一个数组,是一个类似数组的对象(Like Array Object)。虽然NodeList不是一个数组,但是可以使用forEach()对其进行迭代。 还可以使用Array.from()将其转换为实际数组。在一些情况下,NodeList 对象是一个实时集合,也就是说,如果文档中的节点树发生变化,则已经存在的实时 NodeList 对象也会随之变化。

🌺正文

🍊1.首先我们需要知道Node和Element的关系

  • DOM是一棵树,所有节点都是 Node
  • NodeElement 的基类
  • Element 是其他 HTML 元素的基类,如 HTMLDivElement

如下展示一张思维导图帮助大家去理解:

QQ截图20220626225504.png

上面这张图中的关系我们可以用下面的代码去展示

class Node {}

//   Document
class Document extends Node {}
class DocumentFragment extends Node {}

// 文本和注释
class CharacterData extends Node {}
class Comment extends CharacterData {}
class Text extends CharacterData {}

// element
class Element extends Node {}
class HTMLElement extends Element {}

class HTMLDivElement extends HTMLElement {}
class HTMLInputElement extends HTMLElement {}

🥭2.HTMLCollection 和 NodeList

  • HTMLCollectionElement 的集合
  • NodeListNode 的集合

划重点:

  • 获取NodeElement的返回结果可能不一样
  • elem.childNodeselem.children不一样
  • 前者会包含TextComment节点,后者不会

🍎3.拓展内容: 类数组转换为数组的三种方法

HTMLCollectionNodeList 都不是数组,而是类数组

const arr1 = Array.from(list)
const arr2 = Array.prototype.slice.call(list)
const arr3 = [...list]

🧁文末

名言警句:说能做的做说过的\textcolor{red} {名言警句:说能做的做说过的}
原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}
👍 点赞,你的认可是我创作的动力!\textcolor{green}{点赞,你的认可是我创作的动力!}
⭐️ 收藏,你的青睐是我努力的方向!\textcolor{green}{收藏,你的青睐是我努力的方向!}
✏️ 评论,你的意见是我进步的财富!\textcolor{green}{评论,你的意见是我进步的财富!}