之前謝亮兄和我一起討論的一個問題:
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 。
不知道各位客官理解了沒,這個東西確實不好解釋清楚。如果哪裡說的不對,還望大神調教。。