每日3題
25 以下代碼執行后,控制臺中的輸出內容為?
let a = {
i: 0,
[Symbol.toPrimitive]: () => ++a.i,
};
console.log(a == 1 && a == 2 && a == 3);
26 變數 a 會被 GC 嗎,為什么?
function test(){
var a = 1;
return function(){
eval("")
}
}
test();
27 以下代碼執行后,控制臺中的輸出內容為?
console.log([2, 1, 0].reduce(Math.pow));
console.log([].reduce(Math.pow));
公眾號【今天也要寫bug】, 獲取更多前端面試題
答案與決議
25
// 答案:true
// Symbol.toPrimitive 是一個內置的 Symbol 值,
// 它是作為物件的函式值屬性存在的,當一個物件轉換為對應的原始值時
// 如果該函式存在,則會呼叫此函式,
let a = {
i: 0,
[Symbol.toPrimitive]: () => ++a.i,
};
console.log(a == 1 && a == 2 && a == 3);
// == 會觸發型別轉換,而且我們定義了 Symbol.toPrimitive 方法
// 所以 a == 1 觸發該方法回傳 1,并且 a.i 變為 1,所以 a == 1 為 true,
// 同理 a == 2 和 a == 3 均為 true
26
// 答案:不會
// 考察 eval 函式
// 因為 eval 會欺騙詞法作用域,例如 function test(){eval("var a=1")},創建一個 a 變數
// JS 引擎不確定 eval 是否對 a 進行了參考,所以為了保險,不對其進行優化,
// 相似地,try catch 和 with 也會有同樣的問題
// 不建議使用 eval 和 with
function test() {
var a = 1;
return function () {
eval("");
};
}
test();
27
// 答案:1 報錯
// 考察 reduce 方法的使用
// reduce 接受兩個引數:回呼函式和初始值
// 若不提供初始值,則以陣列第一個元素作為初始值,并且回呼函式從陣列第二個元素開始呼叫
// 提供初始值,則回呼從陣列第一個元素開始呼叫
// 回呼函式接受4個引數:previousValue、currentValue、currentIndex、array(即遍歷的陣列)
console.log([2, 1, 0].reduce(Math.pow));
// 執行步驟如下:初始值:2
// 第 1 次呼叫回呼的入參:previousValue=https://www.cnblogs.com/bidong/p/2,currentValue=1,Math.pow 只接受2個引數,結果 2^1=2
// 第 2 次呼叫回呼的入參:previousValue=2,currentValue=0,Math.pow 只接受2個引數,結果 2^0=1
console.log([].reduce(Math.pow));
// 如果陣列為空并且沒有提供初始值,reduce 直接拋出錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505528.html
標籤:JavaScript
上一篇:promise
下一篇:高級前端進階(六)
