0

以下摘录参考ECMAScript 2017

10.1 源文本,语法

转义序列,如\u000A,不会被解释为行终止符(即新行):

在字符串文字、正则表达式文字、模板文字和标识符中,任何 Unicode 代码点也可以使用明确表达代码点数值的 Unicode 转义序列来表达。在评论中,这样的转义序列作为评论的一部分被有效地忽略了。

ECMAScript 与 Java 编程语言的不同之处在于 Unicode 转义序列的行为。

如果 Unicode 转义序列 \u000A 出现在 Java 程序中的字符串文字中,则将其解释为行终止符,这在字符串文字中是不允许的。

在 ECMAScript 程序中的字符串文字中出现的 Unicode 转义序列总是对文字有贡献,并且永远不会被解释为行终止符或可能终止字符串文字的代码点。

11.8.4 字符串文字

代码点可能会在字符串文字中显示为转义序列,但反斜线 ( \) 除外。

字符串文字是用单引号或双引号括起来的零个或多个 Unicode 代码点。Unicode 代码点也可以由转义序列表示。除了结束引号代码点 U+005C (REVERSE SOLIDUS)、 U+000D (CARRIAGE RETURN)、 U+2028 (LINE SEPARATOR)、 U+2029 (PARAGRAPH SEPARATOR)、和 U+000A(线路馈送)。任何代码点都可能以转义序列的形式出现。

问题

  1. \如果不允许(11.8.4),如何在字符串文字中出现转义序列?
  2. 11.8.4。指出代码点可以表示为转义序列。10.1 规定\u000A字符串文字内的转义序列不会被解释为line terminator. 这两个似乎是矛盾的。如果它没有被解释为字符串文字内的换行符,那么它是如何解释的(如果有的话)?
4

1 回答 1

2

如果不允许 \ (11.8.4),如何在字符串文字中出现转义序列?

我认为该部分的关键部分是“按字面显示”,即\字符串文字中的 a 不会转换为结果字符串本身的反斜杠。这并不是说反斜杠是不允许的,而是说它们不会“从字面上出现”。

10.1 规定字符串文字内的转义序列 \uu000A 不会被解释为行终止符。

你跳过了那句话的前面部分“总是对文字有贡献”。\u000A完全允许,并且确实被添加到字符串的内容中。该代码表示​​它不被视为词汇语法意义上的行终止符。它是说

var foo = "one\u000Atwo";

是允许的,即使

var foo = "one
two";

是语法错误。两者都尝试在单词之间使用换行符代码点,但第一个是允许的,因为从词法分析器的角度来看,它实际上并未被视为行终止符。

于 2018-04-03T16:53:30.947 回答