前端进阶之旅前端进阶之旅
  • 基础篇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 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库children 和 childNodes 区别
浏览浏览器DOM 与文档操作

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

parentNode.children 只返回元素子节点,childNodes 返回包括文本、注释在内的所有子节点。遍历时前者不会看到空白文本,后者则可能包含大量文本节点。

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

元素子节点与全部子节点

  1. children只返回 Element 类型的子节点
  2. childNodes返回 Node 的所有子节点类型
  3. live 集合两者都动态反映 DOM 变化

在遍历元素列表时优先用 children,避免空白文本干扰。

核心回答

先记住这个答案

核心区别在于节点类型过滤:children 是 HTMLCollection,只包含 Element,适合列表操作;childNodes 是 NodeList,包含所有 Node。两者均为 live 集合,实时反映 DOM 变化,但遍历时要注意文本节点的影响。

  • children 只含元素节点
  • childNodes 包含文本和注释
  • 两者都是实时集合

节点类型过滤与集合的实时性

children 被定义为 Element 上的只读属性,返回 HTMLCollection,其中每一项都是 Element 类型。浏览器在构造该集合时会自动跳过所有非元素节点,例如文本节点、注释和文档类型节点。这意味着即使父节点下存在换行产生的文本节点,children 的长度也不会因此改变。

childNodes 则定义在 Node 上,返回 NodeList,它包含所有类型的子节点,包括元素、文本(包括空白)、注释以及可能的 CDATA 等。当使用 for 循环等遍历时,必须检查节点类型,否则可能把文本节点当作元素处理。两者都是 live 集合:当子节点增删时,集合长度会实时变化。

遍历列表元素的场景:避免空白文本干扰

假设有一个 <ul id="list">,其中包含 <li> 元素,并且在标签间有缩进换行的文本节点。若用 childNodes 遍历,length 会是元素数量的两倍以上(每个元素前后都有文本节点),打印 nodeName 时会出现 #text,最终无法直接拿到想要的 li。此时必须判断 nodeType === 1 或使用 children。

实际开发中,对用户可控的 DOM 结构,空白文本可能不存在,但对格式化后的 HTML,空白文本很常见。采用 children 可以直接得到所有子元素,无需额外过滤。若确实需要访问文本节点,例如提取纯文本内容,则必须使用 childNodes,并结合 nodeValue 读取。

实时集合的副作用与索引陷阱

children 和 childNodes 都是实时集合,在遍历过程中如果动态删除或添加子节点,集合的大小会立即变化,这可能导致跳过某些元素或无限循环。例如使用 for (let i = 0; i < parent.childNodes.length; i++) 时删除当前文本节点,会使长度收缩,未遍历的节点索引前移。

另一个边界是 children 不能获取文本节点,所以当需要精确处理文本内容时(如拆分词句),只能依赖 childNodes。另外,为了避免 live 集合带来的索引失效,建议将集合快照为静态数组:Array.from(parent.children),但快照与 DOM 不再同步,要注意场合取舍。

回答前,多想一步

容易答错的地方

认为两者都只包含元素节点
childNodes 包含所有子节点类型,包括文本、注释;children 才仅返回元素节点。MDN 文档对不同接口的说明明确区分,混淆会导致遍历时误判节点类型。
认为两个集合是静态快照
children 和 childNodes 都是 live 集合,会随 DOM 变化自动更新。若以为它们固定不变,在操作 DOM 后使用旧的集合长度会得出错误结论。
试着用自己的话回答

面试官还会怎么问?

children 和 childNodes 返回的集合类型有何不同?

children 返回 HTMLCollection,childNodes 返回 NodeList。HTMLCollection 有 namedItem 方法,而 NodeList 没有;两者都支持索引访问,但包含节点范围不同。

如何通过 childNodes 过滤出元素节点?

检查 node.nodeType === Node.ELEMENT_NODE,或者使用 Array.from(childNodes).filter(n => n.nodeType === 1)。更直接是使用 children,因为后者已经天然过滤。

遍历 childNodes 时如何避免把空白文本当节点?

使用 children 直接跳过;若需处理文本节点,可忽略所有 nodeType 为 TEXT_NODE 且 nodeValue 只含空白的节点,或使用 trim() 判断。

从一道题,走向一组知识

把知识连起来

DOM 与文档操作

NodeList 和 HTMLCollection 有什么区别?

children 和 childNodes 分别返回 HTMLCollection 与 NodeList,理解两者集合差异有助于掌握本题的返回值类型。

DOM 与文档操作

DOM 中 Node 和 Element 的区别是什么?

children 与 childNodes 的区别本质是 Element 与 Node 的包含关系,理解基类层次能解释为何不同集合包含节点类型不一致。

参考资料

  • Element: children property

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

本题目录
  1. 先记住这个答案
  2. 节点类型过滤与集合的实时性
  3. 遍历列表元素的场景:避免空白文本干扰
  4. 实时集合的副作用与索引陷阱
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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