Javascript ECMAScript 2017:StringLiteral中的EscapeSequence

Javascript ECMAScript 2017:StringLiteral中的EscapeSequence,javascript,ecmascript-6,ecmascript-2017,ecma,Javascript,Ecmascript 6,Ecmascript 2017,Ecma,以下节选内容涉及到 10.1源文本,语法 转义序列,如\u000A,不会被解释为行终止符(即新行): 字符串文字、正则表达式文字、模板文字和 标识符,任何Unicode代码点也可以使用 Unicode转义序列,显式表示代码点的 数值。在注释中,这样的转义序列是 作为评论的一部分,实际上被忽略了 ECMAScript在行为上与Java编程语言不同 Unicode转义序列的定义 如果Unicode转义序列\u000A 在Java程序的字符串文本中发生,它被解释为 行终止符,在字符串文字中不允许使用

以下节选内容涉及到

10.1源文本,语法

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

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

ECMAScript在行为上与Java编程语言不同 Unicode转义序列的定义

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

一种Unicode转义序列,发生在 ECMAScript程序,始终对文本有贡献,并且从不 解释为行终止符或可能 终止字符串文本

11.8.4字符串文本

除了反向索利多金币(\)之外,代码点可以在字符串文字中显示为转义序列

字符串文字是包含在字符串中的零个或多个Unicode代码点 单引号或双引号。还可以表示Unicode代码点 通过一个转义序列所有代码点都可能以文字形式出现在 字符串文字,结束引号代码点除外,U+005C (反向索利多金币)、U+000D(回车)、U+2028(行分隔符), U+2029(段落分隔符)和U+000A(换行符)任何代码点 可能以转义序列的形式出现。

问题

  • 如果不允许使用
    \
    (11.8.4),则转义序列如何出现在字符串文本中
  • 11.8.4。说明代码点可以表示为转义序列。10.1规定字符串文字中的转义序列
    \u000A
    不解释为
    行终止符。这两者似乎相互矛盾。如果它没有被解释为字符串文字中的换行符,那么它是如何解释的(如果有)
  • 如果\是不允许的(11.8.4),那么转义序列如何出现在字符串文本中

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

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

    您跳过了该引用的前面部分“始终有助于文字”<代码>\u000A
    是完全允许的,并且会添加到字符串的内容中。这段代码的意思是,在词汇语法的意义上,它不被视为行终止符。据说

    var foo = "one\u000Atwo";
    
    即使

    var foo = "one
    two";
    
    是一个语法错误。两者都试图在单词之间使用换行符,但第一个是允许的,因为从词法分析器的角度来看,它实际上并没有被视为行终止符

    如果\是不允许的(11.8.4),那么转义序列如何出现在字符串文本中

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

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

    您跳过了该引用的前面部分“始终有助于文字”<代码>\u000A是完全允许的,并且会添加到字符串的内容中。这段代码的意思是,在词汇语法的意义上,它不被视为行终止符。据说

    var foo = "one\u000Atwo";
    
    即使

    var foo = "one
    two";
    

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

    谢谢,Logan。在最后一点上,如果最终结果实际上是一个包含换行符的字符串值(即转义序列最终被解释为一个行终止符),那么它如何不被视为一个行终止符呢?第11节是关于词汇语法的,该值由中的SV算法确定,如中所述,这与本节的总体评论是分开的,因为总体评论是关于词法分析的。不过这是第10节。它指出,ECMAScript程序中字符串文本中出现的Unicode转义序列始终对该文本起作用,并且从不被解释为行终止符或可能终止字符串文本的代码点。然而,它仍然被这样解释。因此,lexer将
    \u000A
    转换为
    文字标记
    ,其中值为换行符:
    (文字,[linebreak])
    \u000A
    不解释为“行终止符”。在这里,有特定意义的情况下对文本进行词法分析。LineTerminator是一个特定的标记:它不是在讨论最终计算字符串的值是否包含
    \n
    或任何内容。Hmmm,因此您是说在标记化阶段:
    \u000A
    不会计算为非终止符
    LineTerminator
    ,这反过来又会成为终端符号
    ?如果是这样的话,lexer会评估什么标记,什么时候会变成实际的换行符?谢谢,Logan。在最后一点上,如果最终结果实际上是一个包含换行符的字符串值(即转义序列en),那么如何不将其视为行终止符