前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库NodeList 和 HTMLCollection 区别
浏览浏览器DOM 与文档操作

NodeList 和 HTMLCollection 有什么区别?

NodeList 是节点集合,HTMLCollection 是元素集合;前者可能静态或动态,后者是动态的且只含元素。

前端进阶之旅 · 一题精讲更新于 2026.09.05
浏览器#DOM 与文档操作
先看核心答案
理解线索

区分节点与元素集合

  1. 包含范围NodeList 可含任意节点;HTMLCollection 只含元素节点
  2. 动态性HTMLCollection 动态;NodeList 视获取方式而定
  3. 方法差异NodeList 有 forEach 等;HTMLCollection 无

childNodes 返回包含文本节点的 NodeList,children 返回只含元素的 HTMLCollection

核心回答

先记住这个答案

NodeList 和 HTMLCollection 都是类数组的 DOM 节点集合。关键区别:NodeList 可包含任何节点类型(如文本节点),且有的静态(querySelectorAll 返回),有的动态(childNodes 返回);HTMLCollection 只包含元素节点,且是动态的(如 getElementsByTagName 返回)。另外,NodeList 有 forEach 方法,HTMLCollection 没有,但可以用 Array.from 或展开符转为数组后使用数组方法。

  • HTMLCollection 只含元素节点且通常是动态的
  • NodeList 可含文本节点,可能是静态或动态
  • NodeList 有 forEach,HTMLCollection 没有

集合的组成与动态性差异

NodeList 由 childNodes 和 querySelectorAll 等 API 返回。childNodes 是动态的,集合会随 DOM 变化实时更新;querySelectorAll 返回静态快照,此后 DOM 变化不会影响它。NodeList 可以包含文本节点、注释节点和元素节点。

HTMLCollection 由 children、getElementsByTagName 等返回。HTMLCollection 是动态的(live),即 DOM 变化会反映在集合中。children 属性返回的 HTMLCollection 是动态的;getElementsByClassName 返回的也是动态 HTMLCollection。它们只包含元素节点,不含文本和注释。

遍历 li 并统计包含文本的项

假设要统计一个 ul 中所有 li 的个数,其中 li 内可能有文本或嵌套元素。如果使用 parent.children,它返回 HTMLCollection,只含 li 元素,但动态性可能导致遍历中意外增删。如果先获取快照,可用 Array.from。

更复杂:需要统计包含直接文本的 li。必须遍历所有子节点,包括文本节点,这时不能使用 children,而应使用 childNodes。childNodes 返回 NodeList(动态),包含元素、文本、注释。遍历时通过 nodeType 判断,且需注意动态性:如果在遍历中删除节点,索引会变化,应倒序遍历或用静态副本。决策:先转静态数组再处理,避免动态干扰。

静态与动态的失效条件

静态 NodeList(如 querySelectorAll)不随 DOM 变化,但也因此缓存了旧结果。如果先获取列表,再新增匹配元素,列表不会包含新项,容易产生陈旧数据。若需要始终最新,应每次查询或使用动态 HTMLCollection。

动态 HTMLCollection(如 children)实时反映删除,但遍历时可能导致跳过元素:假设循环 i 递增,删除当前元素会使集合长度减小,下一个元素前移,i++ 会跳过它。常见处理是倒序遍历或转换为数组。这两种方式都有成本,需根据操作频率选择。

回答前,多想一步

容易答错的地方

认为 NodeList 总是静态的
实际上 childNodes 返回的 NodeList 是动态的,只有 querySelectorAll 返回静态 NodeList。许多开发者误以为所有 NodeList 都是静态快照,于是缓存 childNodes 后忽略其动态性,在遍历时可能因集合实时变化而跳过或重复处理节点。
混淆 HTMLCollection 和 NodeList 的包含范围
HTMLCollection 仅包含元素,而 NodeList 包含所有节点类型。例如 childNodes 可能包含文本节点,而 children 就没有。若需要过滤文本,仅用 children 会漏掉文本内容,错误地以为元素就是全部。
试着用自己的话回答

面试官还会怎么问?

如何将 HTMLCollection 转换为数组?

可以使用 Array.from(htmlCollection) 或 [...htmlCollection],因为两者都是类数组且可迭代。转换后即可使用 map、filter 等数组方法,但失去了动态性。

querySelectorAll 和 getElementsByTagName 返回的集合有何区别?

querySelectorAll 返回静态 NodeList,只匹配选择器时的元素,不随 DOM 变化。getElementsByTagName 返回动态 HTMLCollection,实时反映新增或删除的匹配元素。后者因此不适合缓存后依赖快照的场景。

为什么 NodeList 有 forEach 而 HTMLCollection 没有?

JavaScript 引擎给 NodeList 提供了迭代器和 forEach 方法,因其设计更现代;HTMLCollection 历史更久,且不是可迭代对象(在某些旧环境)。但都可以通过 Array.from 转换后用数组方法。

从一道题,走向一组知识

把知识连起来

DOM 与文档操作

parentNode.children 和 parentNode.childNodes 在遍历子节点时有什么区别?

children 和 childNodes 的差异正是 NodeList 与 HTMLCollection 区别的直接体现。

DOM 与文档操作

firstChild 和 firstElementChild 有何不同?

firstChild 和 firstElementChild 分别返回 NodeList 中的第一个节点及 HTMLCollection 中的第一个元素,加深理解。

参考资料

  • NodeList

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 集合的组成与动态性差异
  3. 遍历 li 并统计包含文本的项
  4. 静态与动态的失效条件
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑