js連等賦值


 引用: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); //報錯,因為不存在

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM