引用:http://www.iteye.com/topic/785445
https://segmentfault.com/q/1010000002637728
這是一個問題
1 var a = {n:1}; //a指向了一塊地址{n:1}; 2 var b = a; //持有a,以回查 //b對a的引用,也指向那塊地址{n:1}; 3 a.x = a = {n:2}; 4 alert(a.x); // --> undefined 5 alert(b.x); // --> {n:2}
js賦值是右結合的,從右邊開始向左邊賦值
1 A1 = A2 = A3 //等價於 3 A1 = (A2 = A3) 4 //所以全部都是A3的值
上面的問題,在於:
a.x=a={n:2};
錯誤猜想:a 先賦值為{n:2},a.x 發現 a 被重寫后(之前a是{a:1}),a.x = {n:2} ,即a.x指向a,無限循環,消耗內存。引擎限制a.x賦值。 (猜想錯誤,因為b.x 有輸出)
再看,之前狀態:
賦值后:
也就是說 a.x 還是指向之前那塊地址,后面a又指向了一塊新地址{n:2},不再指向之前的地址。若沒有b,則找不到a.x的值({n:2}對象存在,只是沒有指針指向它)。
a.x指向之前的地址是因為: .運算符優先於=賦值運算
證明 . 優先於= :
1 var obj={}; 2 obj.x='1'; //有.和=運算符 3 console.log(obj.x); //1 4 //x能賦值成功說明.優先於=
1、先聲明a對象的x屬性(a指向{n:1})
2、對a賦值,指向{n:2}
3、再對a.x賦值(原來的a,也就是b)
另外,少用連等符號,會出現全局變量
1 (function(){ 2 var a=b=1; 3 }()) 4 console.log(b); // 1 變成全局變量 5 console.log(a); //報錯,因為不存在