百度js面試題

sensus森森發表於2017-07-30
該題的難度係數: ★★★★(3~5顆星之間)

涉及的相關技術點: 1). 記憶體分析 2). 原型鏈 3). 運算子的優先順序

題目如下:

var a = {n: 1}
var b = a
a.x = a = {n: 2}

問:console.log(a.n, b.n)和console.log(a.x, b.x)的值分別為多少?

執行結果如下:



接下來,我們分析下解題思路:

var a = {n: 1} 就是宣告一個物件a,並把屬性名為n,屬性值為1的物件賦給它,


var b = a,然後再把物件a賦值給b,也就是現在a和b都指向了同個地方,值均為{n:1}


接下來的a.x = a = {n: 2}就是一個連等的賦值語句,這裡要主要的是,賦值的時候,是從右向左賦值的,還有就是涉及到優先順序問題,就是‘a.x’的優先順序比賦值‘=’的優先順序來得高,即現在先在記憶體裡面宣告瞭個屬性x,暫時還沒有值,如圖所示:


現在開始右側的賦值,也就是a={n:2},那麼現在a物件的值已經變了,也就是說跟原來斷掉關係了,如圖所示:


接下來,再把a賦值給a.x,也就是現在的x也指向了{n:2}這個物件,如圖所示:


最後,我們回過頭來看下剛才的問題,答案就一目瞭然了。

a.n的值就是2了,

b.n的值就是1了,

a.x值為undefined,因為我們現在遵循的是屬性查詢,就是在整個原型鏈上查詢,如果原型鏈上找不到,就返回undefined了,

b.x的值就是物件{n:2}了。


相關文章