【发布时间】:2017-06-17 02:35:16
【问题描述】:
根据 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' 后跟不是 OctalDigit 的 DecimalDigit。在这种情况下,它将其解析为字符串,其字符串值在第一个位置为 0,然后将下一个数字的代码点值作为 SourceCharacter。当在 '\0' 之后给它一个 OctalDigit 时,它会抛出一个带有消息“八进制转义序列不允许在严格模式下。”的 SyntaxError,这有点误导。 Chakra 和 SpiderMonkey 似乎在 '\0' 之后的任何 DecimalDigit 上抛出 SyntaxError,但是关于八进制转义序列的类似消息,在某些情况下看起来特别奇怪(在 '\0' 之后有 '8' 或 '9',这不可能是严格模式之外的八进制转义序列)。
那么,我的问题是对规范的正确解释是什么?
【问题讨论】:
-
这与特定的 javascript 引擎有什么关系?删除标签。
标签: javascript ecma262