正确解析JavaScript八进制转义序列

时间:2014-01-12 06:22:25

标签: javascript

根据ECMA规范,八进制转义序列定义为

OctalEscapeSequence ::  
    OctalDigit [lookahead ∉ DecimalDigit]  
    ZeroToThree OctalDigit [lookahead ∉ DecimalDigit]  
    FourToSeven OctalDigit  
    ZeroToThree OctalDigit OctalDigit  

ZeroToThree :: one of
    0 1 2 3

FourToSeven :: one of
    4 5 6 7

根据此规范,字符串"\379"不是八进制转义符\37,后跟9。我看对了吗?它不满足第一个规则,因为7是十进制数字。它不满足第二个,因为9是十进制数字。它不满足第三个,因为三个不是4 5 6 7之一。最后,它不满足第四个,因为9不是八进制数字。

那么"\379"的价值是多少呢?我尝试了几个JavaScript翻译器,他们将其解释为八进制转义\37,然后是9。这是解释器中的错误吗?

更新

我知道八进制转义序列在最新的ECMA规范中是可选的。

1 个答案:

答案 0 :(得分:2)

八进制转义序列不是现代浏览器实现的官方规范的一部分。

  

B.1 Additional Syntax

     

ECMAScript的过去版本包含了用于指定八进制文字和八进制转义序列的附加语法和语义。 已从此版本的ECMAScript 中删除了这些内容。这个非规范性附件为八进制文字和八进制转义序列提供了统一的语法和语义,以便与一些较旧的ECMAScript程序兼容。

并且在严格模式下明确禁止它:

  

B.1.1数字文字

     

7.8.3的语法和语义可以扩展如下,但严格模式代码不允许使用此扩展名


鉴于此,\379不是八进制转义序列,因为十进制数字的负前瞻禁止\3\37被视为八进制转义序列。

这是一个语法错误,因为没有其他产品匹配它。具体来说,

CharacterEscapeSequence ::
  SingleEscapeCharacter
  NonEscapeCharacter

(导致"\-"等于"-"的原因)不适用,因为数字不在SingleEscapeCharacter中,也不在NonEscapeCharacter中。


  

是解释器中的错误吗?

如果它只发生在非严格模式下,可能不会。允许口译员根据第16章定义其他语法:

  

实现可以扩展程序语法和正则表达式模式或标志语法。

解释器作者可能会认为他们是一个符合此行为的符合实现的情况,他们只是扩展语法以支持八进制,而不是B.1节建议。< / p>