在 ECMA-262 严格模式下,'\0' 后跟字符串中的十进制数字是否允许?

Is '\0' followed by a decimal digit in string allowed in ECMA-262 strict mode?

根据 ECMA-262 规范(第 6 版),在“\”之后的单引号或双引号字符串中的严格模式下,可能有 EscapeSequence 或 LineTerminatorSequence,并且 EscapeSequence 必须是以下之一:CharacterEscapeSequence, 0 [先行∉ DecimalDigit]、HexEscapeSequence、UnicodeEscapeSequence(参见 11.8.4)。

这是否意味着在'\0'之后根本没有任何十进制数字是完全不正确的?

我知道这样做是为了避免与 LegacyOctalEscapeSequence(来自 B.1.2)混淆,但它只需要在第一个 '\0' 之后放置八进制数字,而 V8 引擎似乎支持这一点方式(见下文)。

在检查了实现后发现 V8 引擎允许“\0”后跟 DecimalDigit 而不是 OctalDigit。在这种情况下,它会将其解析为第一个位置的字符串值为 0 的字符串,然后将下一个数字的代码点值作为 SourceCharacter。当它在'\0' 之后被赋予一个 OctalDigit 时,它会抛出一个带有消息 "Octal escape sequences are not allowed in strict mode." 的 SyntaxError,这有点误导。 Chakra 和 SpiderMonkey 似乎在 '\0' 之后的任何 DecimalDigit 上抛出 SyntaxError,但是带有关于八进制转义序列的类似消息,这在某些情况下看起来特别奇怪(在 '\0' 之后有 '8' 或 '9',这不能是严格模式之外的八进制转义序列。

所以,我的问题是规范的正确解释是什么?

"0 [lookahead ∉ DecimalDigit]" 对我来说听起来很明确:在 [=10=].

之后不允许使用小数位

这意味着 V8 在严格模式下允许 """" 是一个错误。您可以在 https://bugs.chromium.org/p/v8/ 提交错误吗?

有趣的是,test262 似乎根本没有涵盖这种情况...

有点相关:所有浏览器在严格模式下都接受 """",根据规范,这应该抛出 SyntaxError。有一个 thread on esdiscuss.org 表明这种规范违规是(或至少曾经是)网络兼容性所必需的:当现有网站依赖于不符合规范的行为时,浏览器通常不能仅仅将其行为更新为符合规范,因为这样做会破坏此类网站,让网站正常工作对用户(以及浏览器开发人员)来说比符合规范更重要。