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

时间:2017-06-17 02:35:16

标签: 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时,它抛出一个带有消息&#34的SyntaxError;在严格模式下不允许八进制转义序列。",这有点误导。 Chakra和SpiderMonkey似乎在' \ 0'之后的任何DecimalDigit上抛出了SyntaxError,但是有关八进制转义序列的类似消息,在某些情况下看起来特别奇怪(使用' 8'或者' 9'在' \ 0'之后,它不能是严格模式之外的八进制转义序列。)

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

1 个答案:

答案 0 :(得分:2)

" 0 [lookahead∉DecimalDigit]"对我来说听起来很明确:\0之后不允许使用十进制数字。

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

有趣的是,test262似乎根本不包括这个案例......

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