var a = {n: 1}
var b = a;
a.x = a = {n: 2}
console.log(a.x);
console.log(b.x)
- 定义对象{n:1},赋值给a
- b=a浅拷贝,在堆栈中引用同一个对象地址
- 考察优先级,.的运算优先级总是大于赋值运算的优先级,故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);
- 定义对象{n:1},赋值给a
- b=a浅拷贝,在堆栈中引用同一个对象地址
- 从左往右执行,{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}}