解析 JavaScript 连续赋值的求值顺序与引用陷阱

作者:异步漫步

时间:2026-10-30

浏览:522

本文深入解析 JavaScript 中连续赋值语句 a.x=a={n:2} 的执行机制。通过对比拆分赋值与连续赋值的差异,详细阐述赋值运算符的右结合性与属性访问的从左到右求值顺序。重点说明在属性查找阶段对象引用尚未改变,导致最终结果与预期不符的原因,帮助开发者避免此类引用陷阱。

文章目录

连续赋值问题的现象与对比

偶然在网上看到一个关于 JavaScript 的问题,其预期结果与实际运行结果存在显著差异。


var a={n:1}
var b=a;
a.x=a={n:2}
console.log(a.x); 
console.log(b.x);

undefined
Object{n:2}

如果将语句拆分为独立的赋值操作,结果符合直觉预期。


var a={n:1}
var b=a;
a={n:2};
a.x={n:2}
console.log(a.x);//Object{n:2}console.log(b.x);//undefined

a.x=a={n:2} 执行机制解析

具体分析如下:

代码示例:a.x=a={n:2}

JavaScript 的赋值运算符具有右结合性,因此上述语句等价于 a.x=(a={n:2})。

JavaScript 的求值顺序是从左到右(注:曾与同事讨论,对方认为从左到右,我起初认为是从右到左,经核实确认是从左到右)。

1)首先计算等号右侧括号内的最终结果,并将其赋值给左侧 a.x。

在求值过程中,JavaScript 引擎首先查找对象 a 的属性 x。由于该属性不存在,引擎会在 a 当前指向的对象中创建一个新属性 x,并准备将右侧的计算结果赋给它,此时引擎等待右侧表达式的结果。

连续赋值问题的现象与对比

 

2)由于左侧属性 x 需要接收右侧表达式的返回值,引擎开始求值右侧的括号内容 a={n:2},并将得到的结果返回给新创建的属性 x。

连续赋值问题的现象与对比

3)在处理右侧表达式 a={n:2} 时,变量 a 的引用指向发生了改变,指向了新创建的对象 {n:2}。

连续赋值问题的现象与对比

以上即为 JavaScript 连续赋值的执行过程解析,希望对大家有所帮助,也欢迎继续支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章