1. 程式人生 > >js百度面試題

js百度面試題

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。

說出以下程式碼執行結果

var a = {n: 1}

var b = a;

a.x = a = {n: 2}

console.log(a.x);

console.log(b.x)

 

輸出:

undefined

n:2

 

解析:

var a = {n: 1}    // 定義變數 a 為一個新物件,且這個新物件有一個值為 1 的 n 成員

var b = a;    // 定義變數 b ,並且讓 b 也引用變數 a 的物件

// 經過上面這兩句之後,變數 a 和 b 都引用了物件 {n:1}

 

// 下面這句是問題的關鍵

a.x = a = {n: 2}

// a.x = 表示要給 a 引用的那個物件 {n:1} 的 x 成員賦值

// 實際上,此時變數 b 也引用了這個物件 {n:1}

// 此時,JavaScript引擎首先給 {n:1} 新增一個空的 x 成員,即:{n:1,x:undefined}

// 接下來要給{n:1,x:undefined}.x 賦的是什麼值呢?

// 要賦的值是 a = {n: 2}

// 也就是先讓變數 a 引用一個新的物件 {n:2}

// 然後再把 a 的新值賦給 {n:1,x:undefined}.x

// 所以原來的那個物件變成了 {n:1,x:{n:2}}

// 由於變數 b 始終引用那個原來的物件,所以 b 的值是 {n:1,x:{n:2}}

// 由於變數 a 被賦予了一個新的物件,所以 a 的值是 {n:2}

 

// 這面這兩句是控制檯輸出

console.log(a.x);    // 變數 a 引用的物件是 {n:2},沒有 x 成員,所以輸出 undefined

console.log(b.x);    // 變數 b 引用的物件是 {n:1,x:{n:2}},所以輸出 {n:2}  



作者:向布穀鳥說早安
連結:https://www.jianshu.com/p/3be87ab6cf7c

關於Fundebug

Fundebug專注於JavaScript、微信小程式、微信小遊戲、支付寶小程式、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了9億+錯誤事件,得到了Google、360、金山軟體、百姓網等眾多知名使用者的認可。歡迎免費試用!