2

以下摘录参考ECMAScript 2017

11.8.4.2 静态语义:StringValue

StringLiteral::
    "DoubleStringCharactersopt"
    'SingleStringCharactersopt'

1. Return the String value whose elements are the SV of this StringLiteral.

11.8.4.3 静态语义:SV

字符串文字代表 String 类型的值。文字的字符串值 (SV) 是根据字符串文字的各个部分贡献的代码单元值来描述的。

问题

在上面的摘录中,出现了以下术语:

  1. string literal
  2. 非终结符StringLiteral
  3. String value
  4. SV

有人可以帮助解释这些术语之间的区别吗?

另外,最后一句11.8.4.2是什么意思?

4

2 回答 2

4

字符串文字是您(人类编写或阅读代码)可以识别为序列"..."'...'

标记StringLiteral是EMCAScript 形式语法中的非终结符,可以用作为实际字符串文字的终结符替换。

字符串是字符串文字的语义内容。规范说

文字的字符串值 (SV) 是...

因此,我们可以确定一个字符串字面量具有一个字符串值:某个字符串字面量的字符串值代码单元值的集合。

标识符 SV 似乎是“字符串值”的简写(并且可以互换使用)。


另外,11.8.4.2 中的最后一句话是什么意思?

每个非终结符在评估时都会“返回”一些值。线

返回其元素是此 StringLiteral 的 SV 的字符串值。

简单地说,当解析器在程序文本中找到一个 StringLiteral 时,解析该非终结符的结果是与刚刚解析的 StringLiteral 相关联的字符串值(即代码单元值的集合)。

于 2018-04-03T17:20:51.650 回答
3

您正在查看的许多术语对于 JavaScript 平台维护者来说确实很有价值。实际上,您几乎可以肯定已经知道“字符串”是什么。其他术语对于阅读规范很有用。

该术语StringLiteral指的是一段 JavaScript 源代码,JavaScript 程序员会查看并称之为“字符串”;换句话说,在

let a = "hello world";

这是从开始双引号到结束双引号StringLiteral的右侧的字符运行。=它是“非终结符”,因为它不是语法定义中的“终结符”符号。语言语法是从最低级别的终结符号和非终结符号构建的,以描述程序的更高级别的子部分。您在双引号字符串的描述中看到的粗体双引号字符是终端符号的示例。

该术语StringValue是指适用于语法的几个组成部分的内部操作;因为StringLiteral它具有您发布的相当明显的定义。语义规则是根据构成某些语法概念的非终结符编写的。

String value或用于描述字符串的SV分段部分。

JavaScript 规范对术语特别古怪,因为语言委员会一直坚持描述在语言采用的早期随意演变的语义。发明具有明显冗余的术语层是一种应对创建明确描述代码应该做什么的困难的方法,直到最后的细节和奇怪的特殊情况。更复杂的事实是(出于我不知道的原因)词汇语法被分解为与高级构造一样多的令人痛苦的细节,因此这确实加剧了规范的挑剔感。

当知道术语的扩展会很有用时,一个例子可能是解释为什么在从字符串文字而不是正则表达式文字构建正则表达式时,为什么有必要在反斜杠上“加倍”。很明显,对 RegExp 构造函数的调用:

var r = new RegExp("foo\\.bar");

有一个只包含一个的表达式StringLiteral。然后,为了调用构造函数,该操作的语义规则将在某些时候调用获取该字面量的StringValue(以及因此SV),并且这些规则包含每个字面量的详细信息。这就是您遇到的事实,即 SV 语义具有反斜杠规则,特别是一个说两个反斜杠折叠为一个的规则。

现在我并不是说这种解释会比简单的解释更好,但它对问题的每个细节都非常清楚。

于 2018-04-03T17:24:15.247 回答