一道前端面試題引起的思考

最近在看前端面試題的過程當中,發如今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");
}
複製代碼

好了,以上就是我對這道題的解題方案,主要仍是利用了==對變量類型的隱式轉換,固然你們可能還有其餘解題方案。好比說能夠使用es5Object.defineProperty,或者es6Proxy,這裏我就不寫出來了;spa

最後問你們一句,若是將題目中的==換成===,效果仍是同樣的嗎,爲何?歡迎你們留言討論code

更多詳情,請自行查看 stackoverflow;對象

本文做者: Echi
本文連接: juejin.im/user/585e36…
版權聲明: 本文章除特別聲明外,均採用 @BY-NC-SA 許可協議。轉載請註明出處!get

相關文章
相關標籤/搜索