你真的理解js的賦值語句麼

weixin_34219944發表於2014-07-01

之前謝亮兄和我一起討論的一個問題:

var a = {};
a.x = a = 3;

a 的值是什麼。

其實當執行賦值語句的時候,js 的 = 左側不是原始變數地址,而是一個新值
怎麼理解這句話呢?

來看下ECMA對 = 的定義吧。《11.13 Assignment Operators
當然看不懂也沒關係,我也是半懂不懂的簡單理解了下。

文件中說 LeftHandSideExpression = AssignmentExpression
中文翻譯為:左手邊表示式 = 賦值表示式

雖然不知道什麼意思,不過很明顯,左側的不是原始地址,應該是一個表示式。

我們來解釋下這個吧。

var a = {};
a.x = a = 3;
console.log(a); // 3

 var a = {};  這個完全沒問題,完全可以理解。。
那我們來詳細解釋下  a.x = a = 3;  是怎麼回事吧。
用 左手邊表示式 = 賦值表示式 原則套用下,相當於:
左手邊表示式 = (左手邊表示式 = 賦值表示式)

a.x 不再指向 a.x, 而是屬性 x 的一個準備被賦值的表示式。
同樣 a = 3 也是指向 a 的表示式而已。

也就是 a 被賦值為 3,原來那個物件的 x 屬性被複製為 3
其實很容易就可以驗證剛才的說法。

var a = {};
b = a;
a.x = a = 3;
console.log(a); // 3
console.log(b); // {x:3}

執行後 a 是 3, 同時 b.x 也是 3

可能前面說的左手邊表示式不太容易理解,看下這個例子吧:

var obj = {n: 0};
function fn() { return obj; }

fn().n = 123;
console.log(obj);

這個就很直觀了,左手邊表示式的意思就是,左側可以是一個"表示式",當然不是真正意義上的表示式,你看這裡就是呼叫了一個函式,但是n的值確實變成了 123

不知道各位客官理解了沒,這個東西確實不好解釋清楚。如果哪裡說的不對,還望大神調教。。

相關文章