最近在抽空研究 React 源码, 在 ReactDOM.render 的调用链中看到一段有趣的代码:
1  | // React v16.13.1  | 
小朋友, 你是不是有很多疑问🤔️… nodeType 是啥, nodeType === 9 又是什么意思? 
HTML DOM Element 对象
在介绍 nodeType 之前, 不得不说一下包含它的父级对象: HTML DOM Element, 以及一系列的相关概念。
HTML DOM 节点
在 HTML DOM (文档对象模型)中,每个部分都是节点:
- 文档本身是文档节点
 - 所有 
HTML元素是元素节点 - 所有 
HTML属性是属性节点 HTML元素内的文本是文本节点- 注释是注释节点
 
Element 对象
在 HTML DOM 中,Element 对象表示 HTML 元素。Element 对象可以拥有类型为元素节点、文本节点、注释节点的子节点。NodeList 对象表示节点列表,比如 HTML 元素的子节点集合。
元素也可以拥有属性。属性是属性节点。
如果看完这一部分简介还是不太了解, 可以继续看这里:
HTML DOM
这篇讲讲节点(Node)类型常会被忽视的属性:nodeType。
nodeType
定义
nodeType 属性返回以数字值返回指定节点的节点类型。
是的, 你没有看错! 它的定义就只有一句话!
语法
1  | node.nodeType  | 
属性
文档、元素、属性以及 HTML 或 XML 文档的其他方面拥有不同的节点类型。
存在 12 种不同的节点类型,其中可能会有不同节点类型的子节点:
| 常量名 | 常量值 | 节点类型 | 描述 | 子节点 | 
|---|---|---|---|---|
Node.ELEMENT_NODE | 
1 | Element | 代表元素 | Element, Text, Comment, ProcessingInstruction, CDATASection, EntityReference | 
Node.ATTRIBUTE_NODE | 
2 | Attr | 代表属性 | Text, EntityReference | 
Node.TEXT_NODE | 
3 | Text | 代表元素或属性中的文本内容 | None | 
Node.CDATA_SECTION_NODE | 
4 | CDATASection | 代表文档中的 CDATA 部分(不会由解析器解析的文本) | 
None | 
Node.ENTITY_REFERENCE_NODE | 
5 | EntityReference | 代表实体引用 | Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference | 
Node.ENTITY_NODE | 
6 | Entity | 代表实体 | Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference | 
Node.PROCESSING_INSTRUCTION_NODE | 
7 | ProcessingInstruction | 代表处理指令 | None | 
Node.COMMENT_NODE | 
8 | Comment | 代表注释 | None | 
Node.DOCUMENT_NODE | 
9 | Document | 代表整个文档(DOM 树的根节点) | 
Element, ProcessingInstruction, Comment, DocumentType | 
Node.DOCUMENT_TYPE_NODE | 
10 | DocumentType | 向为文档定义的实体提供接口 | None | 
Node.DOCUMENT_FRAGMENT_NODE | 
11 | DocumentFragment | 代表轻量级的 Document 对象,能够容纳文档的某个部分 | Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference | 
Node.NOTATION_NODE | 
12 | Notation | 代表 DTD 中声明的符号 | 
none | 
其中常用的有 1, 2, 3, 8, 9 这五个属性。
例子
1  | const div = document.createElement('div');  | 
想要了解更多有关节点的信息可以继续学习
nodeName,nodeValue.