1. 程式人生 > >一道關於物件賦值的js面試題

一道關於物件賦值的js面試題

一道關於物件賦值的js面試題

  var a = { n : 1};  
  var b = a;  
  a.x = a = {n:  2};  
  alert(a.x);  
  alert(b.x);

輸出:undefined 
[object Object]
請問:a.x = a = {n: 2};

 該句是如何賦值的?

 

ps:

其實這類問題很容易理解,只需要記得變數只是物件的引用,變數並不是物件本身。

  1. 取值的時候順著變數找到物件;

  2. 賦值的時候則改變變數的指向。

所以

  1. 對於 var a = {n: 1},想象一個物件 {n: 1} 放地上,用 a 指著它;

  2. var b = a 就是 b 順著 a 找到 {n: 1},兩者同時指著它;

  3. a.x = a = {n:2} 左往右看,

    1. a.x

       是對 a 取值,順著 a 找到 {n: 1},再找到其 x 屬性等待賦值,

    2. 第二個 a 本應是取值,但右邊有 = 所以繼續變成了賦值操作,a 指向 {n:2}

    3. a = {n:2} 返回 {n:2},給了等待賦值的 {n: 1}.x

  4. alert(a.x),順著 a 找到 {n:2},因為在 3.2 中 a 改變了指向,而 {n: 2}

     沒有 x 屬性;

  5. alert(b.x),順著 b 找到 {n: 1}{n: 1}在 3.1 得到了 x,順著 x 找到了 {n: 2}