You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ECMAScript 2017:字符串字面量、StringValue、String值与SV的区别

字符串字面量、StringValue、String值与SV的差异(基于ES2017规范)

先把你提到的ECMAScript 2017规范内容贴在这里,方便对照理解:

11.8.4.2 静态语义:StringValue
StringLiteral:: "DoubleStringCharactersopt" 'SingleStringCharactersopt'

  1. 返回一个String值,其元素为该StringLiteral的SV。

11.8.4.3 静态语义:SV
字符串字面量代表String类型的值。该字面量的String值(SV)由字符串字面量各部分贡献的代码单元值定义。

接下来逐个拆解它们的核心差异:

  • 字符串字面量(StringLiteral):这是你写代码时敲出来的语法符号,比如"foo"'bar'甚至带转义的"a\nb"。它属于源代码层面的语法结构,不是程序运行时会用到的实际数据,只是用来描述“我要创建一个字符串”的写法。

  • SV:这是规范里用来描述字符串字面量对应底层代码单元集合的术语。简单说,当你写了一个带转义的字面量比如"\u0041",SV就是把这个字面量拆解成实际Unicode代码单元(这里就是A对应的U+0041)的结果。它是一个中间计算逻辑的载体,你在代码里不会直接接触到它,是规范用来明确“字面量到底对应哪些字符”的规则产物。

  • String值:这是ECMAScript运行时里实实在在的数据值,属于语言类型中的String类型。比如你执行const str = "hello",变量str存储的就是这个String值——它是可以被你调用lengthslice等方法操作的实际数据。

  • StringValue:这不是一个值,而是规范定义的一个静态语义算法。它的作用就是接收一个字符串字面量(语法结构),然后基于这个字面量的SV,最终返回对应的String值。相当于把“语法写法”转换成“运行时值”的一套规则集合,是规范用来解释字面量如何变成实际可操作数据的逻辑步骤。

最后再理一遍它们的流转关系:
你写的字符串字面量(语法)→ 先通过SV规则解析出对应的代码单元 → 再通过StringValue算法生成最终的String值(运行时可操作的数据)

内容的提问来源于stack exchange,提问作者Magnus

火山引擎 最新活动