ECMAScript 2017:StringLiteral

时间:2018-04-03 16:42:46

标签: javascript ecmascript-6 ecmascript-2017 ecma

以下摘录参考ECMAScript 2017

10.1源文本,语法

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

  

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

     

ECMAScript与行为中的Java编程语言不同   Unicode转义序列。

     

如果Unicode转义序列\ u000A   发生在Java程序的字符串文字中,它被解释为   行终止符,在字符串文字中不允许。

     

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

11.8.4字符串文字

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

  

字符串文字是包含的零个或多个Unicode代码点   单引号或双引号。也可以表示Unicode代码点   通过逃脱序列。 所有代码点都可能出现在字面上   字符串文字除了关闭引号代码点,U + 005C   (REVERSE SOLIDUS),U + 000D(运输返回),U + 2028(线路分离器),   U + 2029(段落分离器)和U + 000A(LINE FEED)。 任何代码点   可能以转义序列的形式出现。

问题

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

1 个答案:

答案 0 :(得分:2)

  

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

我认为该部分的关键部分是&#34;字面意思是&#34;,这表示字符串文字中的 private LinkedList<Integer> sharedList = new LinkedList<Integer>(); private volatile int sharedValue = 0; private int MAX_LIMIT = 10; public void produce() throws InterruptedException { while (true) { if (sharedValue == MAX_LIMIT) { //'produce' thread waits if list is full synchronized (this) { wait(); } } synchronized (this) { sharedValue = sharedValue + 1; sharedList.add(sharedValue); System.out.println("added value: " + sharedValue); } if (sharedValue == 1) { synchronized (this) { notify(); //notifies 'consume' thread if list is not empty } } } } public void consume() throws InterruptedException { while (true) { if (sharedValue == 0) { //'consume' waits if list is empty synchronized (this) { wait(); } } synchronized (this) { sharedValue = sharedValue - 1; sharedList.remove(); System.out.println("removed value: " + sharedValue); } if (sharedValue == MAX_LIMIT - 1) { synchronized (this) { notify(); //notifies 'produce' if list is not full } } } } 不会在结果字符串本身中转换为反斜杠。它不是说不允许使用反斜杠,而是说他们不会出现字面意思&#34;。

  

10.1表示在字符串文字中转义序列\ uu000A不会被解释为行终止符。

你跳过了引言的前一部分&#34;总是对文字做出贡献&#34;。完全允许\,并将 添加到字符串的内容中。该代码表示​​在词法语法意义上它不被视为行终止符。这是说

\u000A
即使

也允许

var foo = "one\u000Atwo";

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