ECMAScript 2017:StringLiteral 中的 EscapeSequence

Posted

技术标签:

【中文标题】ECMAScript 2017:StringLiteral 中的 EscapeSequence【英文标题】:ECMAScript 2017: EscapeSequence in StringLiteral 【发布时间】:2018-09-13 01:57:06 【问题描述】:

以下摘录参考ECMAScript 2017。

10.1 源文本、语法

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

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

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

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

一个 Unicode 转义序列出现在一个字符串文字中 ECMAScript 程序,总是对字面量有贡献,并且是从不 解释为行终止符或代码点,可能 终止字符串文字。

11.8.4 字符串文字

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

字符串文字是包含在 单引号或双引号。 Unicode代码点也可以表示 通过转义序列。 所有代码点都可能以字面形式出现在 字符串文字,除了结束引号代码点 U+005C (REVERSE SOLIDUS), U+000D (回车), U+2028 (行分隔符), U+2029(段落分隔符)和 U+000A(换行符)。 任何代码点 可能以转义序列的形式出现。

问题

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

【问题讨论】:

【参考方案1】:

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

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

10.1 声明字符串文字中的转义序列 \uu000A 不会被解释为行终止符。

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

var foo = "one\u000Atwo";

允许

var foo = "one
two";

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

【讨论】:

谢谢,洛根。最后一点,如果最终结果实际上是一个带有换行符的字符串值(即转义序列最终被解释为行终止符),它如何不被视为行终止符? Section 11 全部是关于词法语法整体的值由ecma-international.org/ecma-262/8.0/… 中的SV 算法确定,如ecma-international.org/ecma-262/8.0/… 中所述,它与该部分的整体评论是分开的,因为整体评论是关于词法分析。 虽然是第 10 节。它指出a Unicode escape sequence occurring within a string literal in an ECMAScript program always contributes to the literal and is never interpreted as a line terminator or as a code point that might terminate the string literal。然而,它仍然是这样解释的。假设,词法分析器将\u000A 转换为literal token,其中的值是换行符:(literal, [line-break]) \u000A 不被解释为“行终止符”。这里有对文本进行词法分析的具体含义。 LineTerminator 是一个特定的标记:ecma-international.org/ecma-262/8.0/#prod-InputElementDiv 它不是在讨论最终评估字符串的值是否具有\n 或其中的任何内容。 嗯,所以您是说在标记化阶段:\u000A 不会被评估为非终结符号 LineTerminator,而后者又最终成为终结符号 <LF>?如果是这样,词法分析器会评估什么标记,什么时候变成实际的换行符?

以上是关于ECMAScript 2017:StringLiteral 中的 EscapeSequence的主要内容,如果未能解决你的问题,请参考以下文章

ECMAScript 2017(ES8)新特性简介

ECMAScript 2017(ES8) 语言规范发布

ECMAScript 2017(ES8)特性概述

ECMAScript 2017:字符串文字、StringValue、String value 和 SV 之间的区别

ECMAScript 2017:“13.2 创建函数对象”去了哪里(来自 ES5)?

ECMAScript 2016, 2017, 2018 新特性之必读篇