经典面试题之赋值操作

题目:

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

答案

alert(a.x);// --> undefined
alert(b.x);// --> {n:2}

讲解
估计大部分人对a.x=undefined存在疑问。
这里将原则总结为一句话:
代码的执行顺序,先从左到右扫描变量,再从右到左进行赋值

扫描阶段
在a.x = a = {n:2}中,首先扫描到a.x,a.x不存在,所以默认指向null,即a.x=>null。然后扫描到a,a已经存在,所以仍然指向原来的对象,而此时a的指向仍然为{n:1},即a=>{n:1}。

赋值阶段
在a.x = a = {n:2}中,首先赋值最右边。 a = {n:2},让a指向了{n:2},即a=>{n:2}。继续赋值a.x,(重点)此时的a.x中,a的指向没有改变,可以理解为a.x中的a保留了原来的镜像。也就是原对象变为{n:1,x:{n:2}},而此时只有b指向原对象。

因此最终输出的时候
console.log(a.x) 此时a.x中的a已经彻底指向了新对象。输出的是新对象中的x属性值。而老对象中的x属性也已经不再叫做a.x了。至于叫做什么不得而知。
console.log(b.x) 输出的是老对象中x属性值。
老对象为 {n:1,x:{n:2}}
新对象为{n:2}
因此a.x自然取不到值,为undefined。
如果我们再次赋值 a.x = 3;
则输出结果为 console.log(a.x) // {n:2,x:3}。表明原来的a.x已经被删除,在新的a对象中新建了属性x。

其实核心的原理就是 “.”优先级高于"=",所以先保留了指针,后进行了赋值,然后进行了gc,发现a的指向已经改变,删除了原来的指针a.x。

最后一图胜千言

 

 


来源:https://www.jianshu.com/p/d0d8cb54e664

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值