首先看这么一段代码:
var a={n:1}
var b=a
a ={n:2}
a.m = 2
console.log(b)
之前我错误的认为b=a之后,a的所有变动,b都会随着变。
以下为网上一个非常经典的面试题:
var a = {n: 1}
var b = a;
a.x = a = {n: 2}
console.log(a.x);
console.log(b.x)
第一个知识点:
b = a 是浅拷贝,所以在堆栈中引用的是一个对象地址。
第二个知识点:
var a=1,b=2,c=3;
a = b = c;
输出的a,b,c结果都为3。 因为赋值运算从右向左执行。
而我们这道题 a.x = a = {n: 2}
. 的运算优先级大于赋值运算的优先级。
所以先计算
image
image
再计算
所以截止到现在
a的输出值:{ n:2 };
b的输出值:{ n:1 , x={n:2} }
OK, 看明白了我们随便改动来练习一下:
image
image
所以截止到现在
a,b的输出都是一个值:{n={n:2}, f={n:2}}
我们来验证一下:
image
再看下面这段代码看输出什么:
var a = {x:1}
var b =a;
a.x = a ={n:1}
console.log(a)
console.log(b)