關於連等賦值

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}
相關文章
相關標籤/搜索