You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法在JavaScript字符串字面量中存储NUL空字节?

问题解析:直接写入的NUL字符被替换为U+FFFD(65533)的原因

这个问题的核心矛盾不在ECMAScript规范,而在HTML解析阶段的预处理——你的NUL字符在JavaScript引擎处理之前,就已经被浏览器的HTML解析器替换成了U+FFFD(替换字符,对应码点65533)。

具体过程拆解:

  • 你以UTF-8编码保存HTML文件,其中<script>标签内的字符串直接包含了二进制的NUL(U+0000)、SOH(U+0001)、STX(U+0002)字符。
  • 浏览器加载文件后,首先执行HTML解析:根据HTML规范,U+0000属于无效的Unicode码点,解析器会自动将其替换为U+FFFD;而SOH、STX这类控制字符不在HTML的禁止列表中,因此被保留。
  • 当JavaScript引擎拿到经过HTML解析后的代码时,字符串里的NUL已经变成了U+FFFD,所以运行时charCodeAt输出的是65533,而非原始的0。

为什么ES规范允许但实际出现这个情况?

ECMAScript规范确实允许字符串字面量包含所有Unicode码点(包括U+0000),但这是针对JavaScript代码本身的规则。而你的代码在到达JS引擎前,已经被HTML解析器修改了——HTML解析器的处理优先级高于JS引擎的代码解析。

验证方法:

如果改用JS转义序列写法(const a = " \x00\x01\x02 ";),HTML解析器不会处理\x00这种转义字符串,JS引擎会正确解析出U+0000,此时控制台会输出预期的0。

内容的提问来源于stack exchange,提问作者Timmmm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:52:36