javascript賦值運算子等號=深入介紹

antzone發表於2017-04-13

賦值運算子是最為常見也最為簡單的運算子之一。

看如下程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
var a = 3;

上面是一個最為簡單的賦值語句。

下面再來看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
var a = { n: 1 };
a.x = a = { n: 2 };
console.log(a.x);

上面的程式碼輸出結果是undefined,下面就進行一下詳細分析。

建議事先參閱javascript引用型別和基本型別詳解一章節。

先說明一點,那就是賦值運算是從右向左進行的。

(1).var a = { n: 1 },首先宣告一個變數a,併為其賦值物件{ n: 1 }的地址。

(2).a.x = a = { n: 2 },這是程式碼的關鍵部分,由兩個賦值運算子構成,賦值運算子的兩側是表示式,在賦值之前首先要執行這三個表示式,我們可以將程式碼修改成如下形式可能更加清晰一些:

[JavaScript] 純文字檢視 複製程式碼
(a.x) = (a) = ({ n: 2 });

先來看三個表示式的執行:

(a.x)為物件{n:1}新增一個x屬性,但是並沒有為屬性賦值,得到如下物件:

[JavaScript] 純文字檢視 複製程式碼
{
  n: 1,
  x:undefined
}

(a)僅僅是返回物件。

({ n: 2 })同樣僅僅返回物件。

下面進行賦值操作,從右到左進行:

a = { n: 2 },這個時候變數a儲存的是物件{ n: 2 }的地址。

a.x = a,因為在進行賦值操作之前,表示式進行了運算,結果如下:

[JavaScript] 純文字檢視 複製程式碼
{
  n: 1,
  x:undefined
}

當進行了a = { n: 2 }賦值操作之後,上面計算所得的物件已經不再被變數a所引用,a.x = a如此賦值就是將變數a所引用的物件賦值給物件{n: 1,x:undefined}的x屬性。

(3).console.log(a.x),那麼這個輸出值也就是undefined。

相關文章