以下摘录参考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)。 任何代码点 可能以转义序列的形式出现。
问题
\
,如何在字符串文字中出现转义序列(11.8.4)?\u000A
不会被解释为line terminator
。这两个似乎是矛盾的。如果它不被解释为字符串文字中的换行符,那么它是如何解释的(如果有的话)?答案 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";
是语法错误。两者都尝试在单词之间使用换行符,但第一个是允许的,因为从词法分析器的角度来看,它实际上并不被视为行终止符。