鍍金池/ 問答/HTML/ js連等賦值分析

js連等賦值分析

<script>
    var a = {n:1};
    a.x = a = {n:2};
    console.log(a.x);   //undefined
    var b = {n:1};
    b = b.x = {n:2};
    console.log(b);     //object{n:2}
    console.log(b.x);   //undefined
</script>

三個輸出是什么原理?謝謝

回答
編輯回答
淡墨

b = b.x = {n:2};就不解釋了。

a.x = a = {n:2};會特殊一點。
“.“運算符的優(yōu)先級要高于”=“的優(yōu)先級,所以這里的次序是:

  1. 創(chuàng)建了一個x屬性,值為undefined,掛在a下。
  2. a的指向被改變,指向了{n:2}。
  3. 剛才創(chuàng)建的x屬性被賦值為{n:2}

但由于a的指向已經(jīng)改變,不再指向原有的對象,所以a.x就為undefined。

全過程你可以通過以下程序觀察清楚。

var a = {n:1}
var b = a
a.x = a = {n:2}
console.log(b)

2017年7月5日 22:26
編輯回答
我以為
 a.x = a = {n:2};

等式從右邊開始計算,但是在計算之前先求得各個變量的地址。即a.x中的a指向{n:1}這個對象,而連等式中的a指向{n:2}這個對象,即運算完成后,a指向{n:2},因此在連等賦值后打印a.xundefined。用下面這個例子更明白點

clipboard.png

 var b = {n:1};
    b = b.x = {n:2};
    console.log(b);     //object{n:2}
    console.log(b.x);   //undefined

第二個例子同樣的道理,等式中間b.x中的b指向的是{n:1}這個對象,然而等式左邊的b指向了{n:2}這個對象,即運算完成后,b指向{n:2},因此后來打印的b{n:2},而b.x即為{n:2}[x],所以是undefined

2017年4月1日 01:46