var foo = {n:1}; var bar = foo; foo.x = foo = {n:2}; // 或者foo = foo.x = {n:2}也不会改变结果 console.log(foo); // {n: 2} console.log(bar); // {n: 1, x: {n: 2}}
为何bar
不是{n: 2,x: {n: 2}}
呢?指针
在JS中, 首先须要明白一点,js中有5种基本类型(string/number/boolean/null/undefined), 不能对其添加自定义属性。而将对象赋值于一个变量时,其实只是让该变量的指针指向对象;
在赋值运算中, 赋值会从右向左进行,可是有一点, '.' 的运算会优先赋值, 即发生以下:code
1 => foo.x = {n: 2} 即指针指向的地址不变(即非从新指向新对象), 只是对指针指向的对象添加了一个属性获得: {n: 1, x: {n: 2}} 2 => foo = {n: 2} 即foo从新指向了另外一个新的对象 3 => bar的指针未有改变, 仍指向已经被添加了新属性的 {n:1, x: {n: 2}}
这一点须要和非连等
区分开:对象
var foo = {n:1}; var bar = foo; foo = {n: 2}; foo.x = {n: 2}; console.log(foo); // {n: 2, x: {n: 2}} console.log(bar); // {n: 1}
因此,最后foo = {n: 2},bar={n:1,x: {n: 2}}
顺带一提,这也就是为何有这么一道题:string
var a = {n: 1}; var b = a; b.n = 110; console.log(a); //{n: 110}