您正在查看的许多术语对于 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 语义具有反斜杠规则,特别是一个说两个反斜杠折叠为一个的规则。
现在我并不是说这种解释会比简单的解释更好,但它对问题的每个细节都非常清楚。