var a = {n:1}; var b = a; a.x = a = {n:2}; 最后这句a.x = a = {n:2} 先执行a.x,此时a和b均共享{n:1}的栈指针,于是{n:1}变为{n:1,x:undefined}; 接着执行a = {n:2},此时a不再和b共享同对象的指针而是指向新对象{n:2}。 下一步 a.x = a 是最关键的地方,关键之处在于这两个“a”已经是完全不一样的东西,前者(其实可以把它看成b)指向{n:1,x:undefined},后者指向{n:2}。 执行这一步,{n:1,x:undefined}这个对象(b指向的对象)变为{n:1,x:a} 而a只是指向{n:2}。