一道關於物件賦值的js面試題
阿新 • • 發佈:2018-12-04
一道關於物件賦值的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:
其實這類問題很容易理解,只需要記得變數只是物件的引用,變數並不是物件本身。
-
取值的時候順著變數找到物件;
-
賦值的時候則改變變數的指向。
所以
-
對於
var a = {n: 1}
,想象一個物件{n: 1}
放地上,用a
指著它; -
var b = a
就是b
順著a
找到{n: 1}
,兩者同時指著它; -
a.x = a = {n:2}
左往右看,-
a.x
a
取值,順著a
找到{n: 1}
,再找到其x
屬性等待賦值, -
第二個
a
本應是取值,但右邊有=
所以繼續變成了賦值操作,a
指向{n:2}
, -
a = {n:2}
返回{n:2}
,給了等待賦值的{n: 1}
.x
;
-
-
alert(a.x)
,順著a
找到{n:2}
,因為在 3.2 中a
改變了指向,而{n: 2}
x
屬性; -
alert(b.x)
,順著b
找到{n: 1}
,{n: 1}
在 3.1 得到了x
,順著x
找到了{n: 2}
。