var a = {n: 1}; // a保持对{n:1}对象的引用var b = a; // b保持对{n:1}对象的引用a.x = a = {n: 2}; // a的引用被改变a.x // --> undefinedb.x // --> {n: 2}1、.运算符优先,a.x此时保持对堆内存{n: 1}的引用,也就是b也保持对堆内存{n: 1}的引用,于是堆内存{n: 1} => {n: 1, x: undefined},此时a和b还是对原来对象的引用,只不过原来对象增加了x属性2、=从右往左,a = {n: 2},此时a的引用已经变成了{n: 2}这个对象3、a.x=a,此时a.x是保持对{ n: 1, x: undefined}中的x引用,也就是b.x,于是{ n: 1, x: undefined} => {n: 1, x: { n: 2}},即b.x = { n: 2 }复制代码
注意点: 1: 点的优先级大于等号的优先级 2: 对象以'指针'的形式进行存储,每个新对象都是一份新的存储地址-堆内存