必须转义的字符是&、"、'、这5个;其中&最危险,会触发实体识别状态机导致性能陷阱,"和'仅在与包裹引号相同时需转义,虽不解析为标签也建议统一转义。

HTML属性值里哪些字符必须转义
只有 &、"、'、、<code>> 这5个字符在属性值中可能破坏HTML结构,必须处理。其中:& 是最危险的——它会触发浏览器实体识别状态机;" 和 ' 仅在与包裹属性的引号类型相同时才需转义(比如 title="他说:"你好"" 必须把内部双引号写成 "); 和 <code>> 在属性值中一般不会被解析为标签,但为统一策略和防误用,仍建议转义。
不转义 & 会导致解析器多扫一遍
浏览器看到 & 就会启动实体识别流程:从 & 开始向后扫描,直到遇到 ; 或标签结束。如果后面是 &foo 这种非法形式,解析器会一直扫到换行或下一个标签才放弃——这不只是语义错误,更是性能陷阱。
- 每个
&至少带来1次额外字符遍历 + 1次哈希查表(查命名实体) - 若后续没跟
;,延迟终止还会拉长扫描范围 - 链式替换(比如先转
再转 <code>&)可能把原始文本里的&变成&,再生成新的&,让问题翻倍
getAttribute() 返回的是解码后的值,不是原始HTML
DOM 层面的属性值存储不保留转义形式:e.setAttribute('data-x', 'a<b c> 后调用 <code>e.getAttribute('data-x') 得到的是 "a<b c>,不是 <code>"a<b c>。这意味着:</b>
- 不能靠
getAttribute()判断原始HTML里是否用了实体 - 想比对原始输入,得从
outerHTML或服务端源头拿未解析版本 - 用
dataset访问自定义属性时,行为一致——也是解码后值
空格类实体在属性中会被当作普通字符处理
(不换行空格)和 (普通空格)在属性值中都会被浏览器解码为对应Unicode字符,但它们语义不同: 是U+00A0, 是U+0020。JavaScript里 === 比较会返回 false,即使肉眼看起来一样。更隐蔽的是,某些CSS排版规则(如 white-space: nowrap)只对 生效,对普通空格无效。
真正容易被忽略的点是:转义不是为了“让字符好看”,而是为了不让解析器走错分支。哪怕你确认内容里没有脚本,只要含大量 &,首屏解析就可能慢几毫秒——这个开销在富文本编辑器或日志面板里会立刻显现。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











