你真的理解js的赋值语句么
之前谢亮兄和我一起讨论的一个问题:
1 2 | var a = {}; a.x = a = 3; |
a 的值是什么。
其实当执行赋值语句的时候,js 的 = 左侧不是原始变量地址,而是一个新值。
怎么理解这句话呢?
来看下ECMA对 = 的定义吧。《11.13 Assignment Operators》
当然看不懂也没关系,我也是半懂不懂的简单理解了下。
文档中说 LeftHandSideExpression = AssignmentExpression
中文翻译为:左手边表达式 = 赋值表达式
虽然不知道什么意思,不过很明显,左侧的不是原始地址,应该是一个表达式。
我们来解释下这个吧。
1 2 3 | var a = {}; a.x = a = 3; console.log(a); // 3 |
var a = {}; 这个完全没问题,完全可以理解。。
那我们来详细解释下 a.x = a = 3; 是怎么回事吧。
用 左手边表达式 = 赋值表达式 原则套用下,相当于:
左手边表达式 = (左手边表达式 = 赋值表达式)
a.x 不再指向 a.x, 而是属性 x 的一个准备被赋值的表达式。
同样 a = 3 也是指向 a 的表达式而已。
也就是 a 被赋值为 3,原来那个对象的 x 属性被复制为 3。
其实很容易就可以验证刚才的说法。
1 2 3 4 5 | var a = {}; b = a; a.x = a = 3; console.log(a); // 3 console.log(b); // {x:3} |
执行后 a 是 3, 同时 b.x 也是 3
可能前面说的左手边表达式不太容易理解,看下这个例子吧:
1 2 3 4 5 | var obj = {n: 0}; function fn() { return obj; } fn().n = 123; console.log(obj); |
这个就很直观了,左手边表达式的意思就是,左侧可以是一个"表达式",当然不是真正意义上的表达式,你看这里就是调用了一个函数,但是n的值确实变成了 123 。
不知道各位客官理解了没,这个东西确实不好解释清楚。如果哪里说的不对,还望大神调教。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述