最近在看前端面試題的過程當中,發如今
stackoverflow
上有這麼一道題,題目大概是這樣的:前端
// 請在問號處填寫你的答案,使下方等式成立
let a = ?;
if(a == 1 && a == 2 && a == 3) {
console.log("Hi, I'm Echi");
}
複製代碼
一看到這道題,相信大多數人心目中就已經最少有兩種實現方案了。咱們知道當一個對象在轉換爲基本類型時,首先它會先調用 valueOf
而後調用 toString
, 因此咱們嘗試着改寫這兩種方法。es6
(一) 使用valueOf
實現面試
let a = {
i: 1,
valueOf() {
return a.i++;
}
};
if(a == 1 && a == 2 && a == 3) {
console.log("Hi, I'm Echi");
}
複製代碼
(二) 使用toString
實現ui
let a = {
i: 1,
toString() {
return a.i++;
}
};
if(a == 1 && a == 2 && a == 3) {
console.log("Hi, I'm Echi");
}
複製代碼
接下來咱們來看對象的Symbol.toPrimitive
屬性,該屬性會指向一個方法。當對象被轉化爲原始類型的值時,會調用這個辦法,返回該對象對應的原始類型值,且該方法在轉基本類型時調用優先級最高。因此咱們就有了第三種方案:lua
(三) 使用Symbol.toPrimitive
實現es5
let a = {
i: 1,
[Symbol.toPrimitive]() {
return a.i++;
}
};
if(a == 1 && a == 2 && a == 3) {
console.log("Hi, I'm Echi");
}
複製代碼
好了,以上就是我對這道題的解題方案,主要仍是利用了==
對變量類型的隱式轉換,固然你們可能還有其餘解題方案。好比說能夠使用es5
的Object.defineProperty
,或者es6
的Proxy
,這裏我就不寫出來了;spa
最後問你們一句,若是將題目中的==
換成===
,效果仍是同樣的嗎,爲何?歡迎你們留言討論code
更多詳情,請自行查看 stackoverflow;對象
本文做者: Echi
本文連接: juejin.im/user/585e36…
版權聲明: 本文章除特別聲明外,均採用 @BY-NC-SA 許可協議。轉載請註明出處!get