【问题标题】:Is '\0' followed by a decimal digit in string allowed in ECMA-262 strict mode?在 ECMA-262 严格模式下,'\0' 是否允许在字符串中后跟十进制数字?
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-08-21
    • 2021-03-31
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多