你提到的属性(如class、id)本身不是独立的节点,但DOM中确实存在属性节点的概念(nodeType=2),只是日常开发中很少直接操作它。以下是通俗解释:
1. 属性和属性节点的区别
属性(常用方式)
直接通过元素对象的属性或方法访问,比如:
const div = document.querySelector('div');
console.log(div.className); // 直接读class属性值
div.setAttribute('id', 'box'); // 通过方法修改属性这不是节点,只是元素的属性值。
属性节点(罕见用法)
通过getAttributeNode()获取的特殊节点对象(nodeType=2):
const attrNode = div.getAttributeNode('class');
console.log(attrNode.nodeType); // 2
console.log(attrNode.nodeValue); // 属性值(如"red-box")这种用法在99%的场景下都不需要。
2. 为什么通常不用属性节点?
操作繁琐:直接
div.className比getAttributeNode('class').nodeValue简单得多。性能差:属性节点会额外占用内存。
现代API替代:
getAttribute()/setAttribute()已足够。
3. 类比解释
把元素节点比作人:
属性是衣服:
class是T恤颜色,id是身份证号——它们是人的特征,但不是独立的人。属性节点是衣架上的标签:理论上可以单独拿下来(
getAttributeNode),但没人会这么做,直接看衣服(属性)更直观。
总结
属性(如
class):是元素节点的特征值,不是独立节点。属性节点:是DOM规范中的一种历史设计,几乎无用,知道它存在即可。