连续赋值(从堆栈角度解析)var a = {n:1}; a = b ;a.x=a={n:2};

前提:

1. 首先明白的是.的优先级是高于=的优先级,且.的运算符是从左到右的,=的运算符是从右到左的

对于 var a = {n:1};a = b中

a 指向了堆内存中的对象{n:1}, var b=a; a赋予给b的时候传的是栈中的地址(相当于新建了一个不同名“指针”) ,而不是堆内存中的对象。

对于 a.x=a={n:2};

之前说了“.”的优先级大于赋值运算符的优先级,所以先来看a.x;a.x实际上是未定义的;

再来看赋值运算符的从右向左解析;a = {n : 2},a被从新赋值,指向了一个新对象,而此时a.x已经先行执行完,其实指是{ n:1,x: undefined } 这个对象,接下来看左边的等号,这个对象的x值 = 等号右边计算的结果(a={n:2},所以此时b的值通过箭头可以看出等于{n:1,x:{n:2}},a的值指向新对象{n:2}

所以: a.x 就是undefined, b.x指的就是 {n:2}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值