let a = {
i: 0,
[Symbol.toPrimitive]: () => ++a.i,
};
console.log(a == 1 && a == 2 && a == 3);
function test(){
var a = 1;
return function(){
eval("")
}
}
test();
console.log([2, 1, 0].reduce(Math.pow));
console.log([].reduce(Math.pow));
公眾號(hào)【今天也要寫(xiě)bug】, 獲取更多前端面試題
長(zhǎng)興ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
// 答案:true
// Symbol.toPrimitive 是一個(gè)內(nèi)置的 Symbol 值,
// 它是作為對(duì)象的函數(shù)值屬性存在的,當(dāng)一個(gè)對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的原始值時(shí)
// 如果該函數(shù)存在,則會(huì)調(diào)用此函數(shù)。
let a = {
i: 0,
[Symbol.toPrimitive]: () => ++a.i,
};
console.log(a == 1 && a == 2 && a == 3);
// == 會(huì)觸發(fā)類(lèi)型轉(zhuǎn)換,而且我們定義了 Symbol.toPrimitive 方法
// 所以 a == 1 觸發(fā)該方法返回 1,并且 a.i 變?yōu)?1,所以 a == 1 為 true,
// 同理 a == 2 和 a == 3 均為 true
// 答案:不會(huì)
// 考察 eval 函數(shù)
// 因?yàn)?eval 會(huì)欺騙詞法作用域,例如 function test(){eval("var a=1")},創(chuàng)建一個(gè) a 變量
// JS 引擎不確定 eval 是否對(duì) a 進(jìn)行了引用,所以為了保險(xiǎn),不對(duì)其進(jìn)行優(yōu)化。
// 相似地,try catch 和 with 也會(huì)有同樣的問(wèn)題
// 不建議使用 eval 和 with
function test() {
var a = 1;
return function () {
eval("");
};
}
test();
// 答案:1 報(bào)錯(cuò)
// 考察 reduce 方法的使用
// reduce 接受兩個(gè)參數(shù):回調(diào)函數(shù)和初始值
// 若不提供初始值,則以數(shù)組第一個(gè)元素作為初始值,并且回調(diào)函數(shù)從數(shù)組第二個(gè)元素開(kāi)始調(diào)用
// 提供初始值,則回調(diào)從數(shù)組第一個(gè)元素開(kāi)始調(diào)用
// 回調(diào)函數(shù)接受4個(gè)參數(shù):previousValue、currentValue、currentIndex、array(即遍歷的數(shù)組)
console.log([2, 1, 0].reduce(Math.pow));
// 執(zhí)行步驟如下:初始值:2
// 第 1 次調(diào)用回調(diào)的入?yún)ⅲ簆reviousValue=2,currentValue=1,Math.pow 只接受2個(gè)參數(shù),結(jié)果 2^1=2
// 第 2 次調(diào)用回調(diào)的入?yún)ⅲ簆reviousValue=2,currentValue=0,Math.pow 只接受2個(gè)參數(shù),結(jié)果 2^0=1
console.log([].reduce(Math.pow));
// 如果數(shù)組為空并且沒(méi)有提供初始值,reduce 直接拋出錯(cuò)誤