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

标签 javascript ecma262

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

这是否意味着在“\0”之后有任何 DecimalDigit 是完全不正确的?

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

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

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

最佳答案

“0 [lookahead ∉ DecimalDigit]”对我来说听起来很明确:\0 之后不允许使用小数位。

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

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

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

关于javascript - 在 ECMA-262 严格模式下是否允许 '\0' 后跟字符串中的十进制数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44600242/

相关文章:

javascript - jquery 使用单选按钮和复选框切换数组列表

javascript - 匹配某个标点符号可以存在于正则表达式中的字符串内部或之后的字符串

javascript - 在 Chrome 中推送和弹出卡住数组不会抛出异常

javascript - 为什么我们不停止使用 JavaScript 这个词,转而使用 ECMAScript?

javascript - 为什么 ''(空字符串)会渗透所有字符串?

javascript - Bootstrap 轮播变得困惑

javascript - 如何将字符串替换为 mysql.format?

javascript - React componentDidUpdate 不会在 url 更改时更改 props.match.params ?

javascript - v8 何时会实现 ECMAScript 5?

java - Java 中的 ECMA 262/Perl 5 正则表达式支持