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}