JavaScript如何實現(xiàn) a == 1 && a == 2 && a == 3?

今天來看一道面試題,題目如下:如何使 a == 1 && a == 2 && a == 3成立。

分析:

比較兩個值是否相等有兩種,一個是 “==”,一個是“===”,而這里使用的是 “==”

===:絕對相等,左右兩邊值和類型都相等。(如 1 === '1' 是不成立的)

== :相等,左右兩邊類型不同,會默認先轉(zhuǎn)換為相同的類型,再去作比較。

  • 對象 == 字符串:對象轉(zhuǎn)字符串
  • null == undefined:相等,但和其他值都不相等
  • NaN == NaNNaN與任何值都不相等(包括自己)
  • 剩下的都是轉(zhuǎn)化為數(shù)字
  • 對象轉(zhuǎn)化為數(shù)字或字符串:
    • 先調(diào)用 Symbol.toPrimitive 這個屬性
    • 沒有這個屬性,再去調(diào)用valueOf這個屬性去獲取原始值(基本類型值)
    • 沒有原始值,再去調(diào)用toString變?yōu)樽址?/li>
    • 如果最后是轉(zhuǎn)換為數(shù)字,再去調(diào)用Number,把字符串轉(zhuǎn)換為數(shù)字

1、通過數(shù)據(jù)類型轉(zhuǎn)換的方式

var a  = {
    i: 0
}
a[Symbol.toPrimitive] = function () {
    return ++this.i;
}
if (a == 1 && a == 2 && a == 3) {
    console.log('OK');
}
var a = [1, 2, 3];
a.toString = a.shift;
if (a == 1 && a == 2 && a == 3) {
    console.log('OK');
}

2、通過數(shù)據(jù)劫持的方式

在全局上下文中基于var/function聲明變量,相當于給window設置對應的屬性window.a。Object.definePrototype借此對象中的某個屬性的獲取和設置等操作。

var i = 0;
Object.defineProperty(window, 'a', {
    get () {
        // 獲取window.a的時候觸發(fā)getter函數(shù)
        return ++i;
    },
    set (value) {
        // 設置window.a屬性值的時候觸發(fā)setter函數(shù)
    }
})
if (a == 1 && a == 2 && a == 3) {
    console.log('OK');
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容