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、金山軟體、百姓網等眾多知名使用者的認可。歡迎免費試用!