在日常工作中,有时为了图省事,会直接使用连等赋值
var a = b = 100
但是,这么做会埋下一个很大的坑
js 在执行上述代码操作时,实际会产生一个全局变量b,所以在使用连等时要注意这一点
下面再说说本文的重点
连等的执行逻辑
来看一个面试题
var a = {n:1};
a.x = a = {n:2};
console.log(a.x); // 输出?原因?
先说两条结论吧
1.连等时从右往左执行
2.js每次执行前会保存之前的引用
1.js会把a.x和a中的a的引用地址提出来,此时指向{n:1}
2.新开开辟一个空间,存放{n:2}
3.a={n:2} 将a的地址指向{n:2}
4.a.x=a (真正的高潮来了)此时,a会赋给a.x,但参考结论2,a.x执行前是里面的a引用地址是指向{n:1}的,也就是说会把{n:1}新增一个x属性,内容为{n:2}
{n:1,x:{n:2}}
5.a.x= a执行结束后,由于原{n:1}没有被调用地方,所以会被系统收回,此时a.x中的a 指向{n:2} ,所以 a.x为undefined
最后一点,如果{n:1}没有被回收,会怎么样呢?
var a = {n:1};
b = a; // 引用{n:1}
a.x = a = {n:2};
console.log(a.x === a) //false
console.log(a === b.x) //true
是不是很神奇!