赋值问题

125 阅读1分钟
var a = {n: 1}  
var b = a;  
a.x = a = {n: 2}  
console.log(a.x);  
console.log(b.x)
  1. 定义对象{n:1},赋值给a
  2. b=a浅拷贝,在堆栈中引用同一个对象地址
  3. 考察优先级,.的运算优先级总是大于赋值运算的优先级,故a.x = xxx,在引用对象中添加一个x,在堆栈中a,b都指向对象{n: 1, x={a={n:2}}};接下来a={n:2}这个运算表达式有创建了一个新的对象{n:2}同时让a指向了这个对象。b此时指向{n: 1, x:{n:2}}。所以此时内存中应该有两个对象,一个是a指向{n:2},另一个是b指向{n: 1, x:{n:2}}

结果即

a.x undefined

b.x {n:2}

补充例子

var a = {n:1};
var b = a;
b.n = a.f = {n:2};
console.log(a, b);
  1. 定义对象{n:1},赋值给a
  2. b=a浅拷贝,在堆栈中引用同一个对象地址
  3. 从左往右执行,{n=a.f={n:2}},此时a,b都引用此对象,然后执行a.f={n:2},在{n=a.f={n:2}}对象的基础上添加f的值,并未新开辟引用地址,{f: {n:2}, n: {n:2}}

结果即

a {f: {n:2}, n: {n:2}}

b {f: {n:2}, n: {n:2}}