You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ECMAScript规范变量赋值机制:值拷贝还是引用共享?

ECMAScript变量赋值机制:规范定义与实现解读

你的猜想有部分合理性,但需要更精准的拆解:ECMAScript规范层面严格采用值拷贝的赋值语义(即你所说的变体1),但允许引擎对不可变原始值做引用共享的实现优化——不过这种优化对开发者完全透明,不会影响代码的可观测行为。

一、规范明确的赋值逻辑:值拷贝语义

ECMAScript规范对赋值的定义清晰指向值拷贝:

  • 对于AssignmentExpression,执行步骤是先计算右侧表达式得到值V,再将左侧标识符的绑定值设置为V;
  • Declarative Environment Record的SetMutableBinding方法明确说明,是将名称为N的标识符的当前绑定值更改为值V。

用你的示例验证:

let a = 4 // 将值4绑定到变量a
let b = a // 将a的绑定值(4)拷贝给b的绑定
a = 5 // 将a的绑定值修改为5,与b的绑定无关

此时b的值仍然是4,这是规范保证的可观测行为,完全符合值拷贝的逻辑。

二、原始值不可变性与引用共享的混淆

你提到的变体2相关描述,本质是实现优化而非规范定义的赋值机制:

  • 规范明确原始值(数字、字符串、布尔值等)是不可变的——你无法修改值本身(比如不能把数字4改成5),但这和赋值的语义无关;
  • 引擎可以对不可变的原始值做引用共享优化:比如让所有绑定到4的变量都指向内存中的同一个4实例,但因为原始值不可修改,这种共享不会导致任何可观测的行为变化(你永远无法通过修改a来影响b的值);
  • MDN、《Eloquent JavaScript》等文档提及原始值不可变性,是为了区分原始值和对象的行为(对象赋值是拷贝引用,修改对象内容会影响所有持有该引用的变量),但这并不意味着原始值的赋值是引用共享语义——只是实现上可以做这样的优化。

总结

规范严格遵循值拷贝的赋值语义(变体1),引用共享只是引擎针对不可变原始值的优化手段,且这种优化对开发者不可见,不会改变代码的运行结果。开发者只需要按照规范的语义编写代码即可,无需关心底层实现细节。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:35:24