孟欣 - js赋值顺序/var a = {n: 1}   var b = a;   a.x = a = {n: 2}   console.log(a.x);   console.log(b.x)

赋值顺序

以下为网上一个非常经典的面试题:

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

OK我们来解答一下

第一个知识点:

b = a 是浅拷贝,所以在堆栈中引用的是一个对象地址。

孟欣 - js赋值顺序/var a = {n: 1}   var b = a;   a.x = a = {n: 2}   console.log(a.x);   console.log(b.x)

第二个知识点:

var a=1,b=2,c=3;

a = b = c;

输出的a,b,c结果都为3。  因为赋值运算从右向左执行

而我们这道题 a.x = a = {n: 2} 

. 的运算优先级大于赋值运算的优先级。 

所以先计算

孟欣 - js赋值顺序/var a = {n: 1}   var b = a;   a.x = a = {n: 2}   console.log(a.x);   console.log(b.x)

孟欣 - js赋值顺序/var a = {n: 1}   var b = a;   a.x = a = {n: 2}   console.log(a.x);   console.log(b.x)

再计算

孟欣 - js赋值顺序/var a = {n: 1}   var b = a;   a.x = a = {n: 2}   console.log(a.x);   console.log(b.x)

孟欣 - js赋值顺序/var a = {n: 1}   var b = a;   a.x = a = {n: 2}   console.log(a.x);   console.log(b.x)

所以截止到现在

a的输出值:{ n:2 };

b的输出值:{ n:1 , x={n:2} }

 

OK, 看明白了我们随便改动来练习一下:

孟欣 - js赋值顺序/var a = {n: 1}   var b = a;   a.x = a = {n: 2}   console.log(a.x);   console.log(b.x)

孟欣 - js赋值顺序/var a = {n: 1}   var b = a;   a.x = a = {n: 2}   console.log(a.x);   console.log(b.x)

所以截止到现在

a,b的输出都是一个值:{n={n:2}, f={n:2}}

我们来验证一下:

孟欣 - js赋值顺序/var a = {n: 1}   var b = a;   a.x = a = {n: 2}   console.log(a.x);   console.log(b.x)