每日3題 25 以下代碼執行後,控制臺中的輸出內容為? let a = { i: 0, [Symbol.toPrimitive]: () => ++a.i, }; console.log(a == 1 && a == 2 && a == 3); 26 變數 a 會被 GC 嗎,為什麼? functi ...
每日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=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 直接拋出錯誤