a 可以同時(shí) == 1 && == 2 && == 3嗎锯茄?

作者:魚頭的Web海洋 公號(hào) / 陳大魚頭

此題目的答案可以分為三大類:

  1. 類型轉(zhuǎn)換時(shí)的劫持
    首先我們要知道鹃彻,在 JS 中類型轉(zhuǎn)換只有三種情況,分別是:

轉(zhuǎn)換為布爾值

轉(zhuǎn)換為數(shù)字

轉(zhuǎn)換為字符串

轉(zhuǎn)換為原始類型
對(duì)象在轉(zhuǎn)換類型的時(shí)候筒占,會(huì)執(zhí)行原生方法ToPrimitive贪庙。

其算法如下:

如果已經(jīng)是 原始類型,則返回當(dāng)前值翰苫;

如果需要轉(zhuǎn) 字符串 則先調(diào)用 toSting方法止邮,如果此時(shí)是 原始類型 則直接返回,否則再調(diào)用 valueOf方法并返回結(jié)果奏窑;

如果不是 字符串导披,則先調(diào)用 valueOf方法,如果此時(shí)是 原始類型 則直接返回埃唯,否則再調(diào)用 toString方法并返回結(jié)果盛卡;

如果都沒有 原始類型 返回,則拋出 TypeError類型錯(cuò)誤筑凫。

當(dāng)然滑沧,我們可以通過(guò)重寫 Symbol.toPrimitive來(lái)制定轉(zhuǎn)換規(guī)則并村,此方法在轉(zhuǎn)原始類型時(shí)調(diào)用優(yōu)先級(jí)最高。

所以以此定義我們可以有以下四種答案:

?var a = {

   arr: [3, 2, 1],

   valueOf () {

       console.group('valueOf')

       console.log(this.arr)

       console.groupEnd('valueOf')

       return this.arr.pop()

   }

}

if (a == 1 && a == 2 && a == 3) {

   console.log('biu')

}

var b = {

   arr: [3, 2, 1],

   toString () {

       console.group('toString')

       console.log(this.arr)

       console.groupEnd('toString')

       return this.arr.pop()

   }

}

if (b == 1 && b == 2 && b == 3) {

   console.log('biu')

}

var c = {

   arr: [3, 2, 1],

   [Symbol.toPrimitive] () {

       console.group('Symbol.toPrimitive')

       console.log(this.arr)

       console.groupEnd('Symbol.toPrimitive')

       return this.arr.pop()

   }

}

if (c == 1 && c == 2 && c == 3) {

   console.log('biu')

}

var  d = [1, 2, 3]

d.join = d.shift

if (d == 1 && d == 2 && d == 3) {

   console.log('biu')

}

注:事實(shí)上滓技,這四種可以算是同一種哩牍。關(guān)于最后一種,我們可以來(lái)看看ECMA中的 Array.prototype.toString() 定義:

定義 array 為 ToObject(thisvalue)(原生方法令漂,將當(dāng)前數(shù)組轉(zhuǎn)換成對(duì)象)膝昆;

定義 func 為 Get(array,'join')(原生方法,在這一步調(diào)用 join 方法)叠必;

如果 IsCallble(func) (原生方法荚孵,判斷是否有內(nèi)部可調(diào)用的函數(shù))為 false,則 設(shè)置 func 原生函數(shù) %ObjProto_toString%(原生函數(shù)纬朝, toString 的具體實(shí)現(xiàn))收叶;

返回 Call(func,array)。

  1. 對(duì) getter 的劫持
    所謂的 getter 就是對(duì)象屬性在進(jìn)行查詢時(shí)會(huì)被調(diào)用的方法 get共苛,利用此函數(shù)也可以實(shí)現(xiàn)題目功能判没。

代碼如下:

window.val = 0

Object.defineProperty(window, 'd', {

   get () {

       return ++this.val

   }

})

if (d == 1 && d == 2 && d == 3) {

   console.log('biu')

}

const e = new Proxy({}, {

 val: 1,

 get ()  {

   return () => this.val++;

 }

});

if (e == 1 && e == 2 && e == 3) {

   console.log('biu')

}
  1. 正則表達(dá)式
    JS 中的 RegExp.prototype.exec() 作用是在一個(gè)指定字符串中執(zhí)行一個(gè)搜索匹配,返回一個(gè)結(jié)果數(shù)組或 null隅茎。

當(dāng)正則表達(dá)式使用 " g" 標(biāo)志時(shí)澄峰,可以多次執(zhí)行 exec 方法來(lái)查找同一個(gè)字符串中的成功匹配。當(dāng)你這樣做時(shí)辟犀,查找將從正則表達(dá)式的 lastIndex 屬性指定的位置開始俏竞。( test() 也會(huì)更新 lastIndex 屬性)。

lastIndex 是正則表達(dá)式的一個(gè)可讀可寫的整型屬性堂竟,用來(lái)指定下一次匹配的起始索引胞此。只有正則表達(dá)式使用了表示全局檢索的 " g" 標(biāo)志時(shí),該屬性才會(huì)起作用跃捣。

注:只有正則表達(dá)式使用了表示全局檢索的 " g" 標(biāo)志時(shí),該屬性才會(huì)起作用夺蛇。

綜上所述疚漆,我們可以有方案如下:

var f = {

   reg: /\d/g,

   valueOf () {

       return this.reg.exec(123)[0]

   }

}

if (f == 1 && f == 2 && f == 3) {

   console.log('biu')

}

注:上述方法其實(shí)也利用了類型轉(zhuǎn)換的特點(diǎn)。然后暫時(shí)就寫下以上三種答案刁赦,不知道聰明的你是否還有別的解法呢娶聘?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甚脉,隨后出現(xiàn)的幾起案子丸升,更是在濱河造成了極大的恐慌,老刑警劉巖牺氨,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狡耻,死亡現(xiàn)場(chǎng)離奇詭異墩剖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)夷狰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門岭皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沼头,你說(shuō)我怎么就攤上這事爷绘。” “怎么了进倍?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵土至,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猾昆,道長(zhǎng)陶因,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任毡庆,我火速辦了婚禮坑赡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘么抗。我一直安慰自己毅否,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布蝇刀。 她就那樣靜靜地躺著螟加,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吞琐。 梳的紋絲不亂的頭發(fā)上捆探,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音站粟,去河邊找鬼黍图。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奴烙,可吹牛的內(nèi)容都是我干的助被。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼切诀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揩环!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起幅虑,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丰滑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后倒庵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褒墨,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炫刷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了貌亭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬唯。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖圃庭,靈堂內(nèi)的尸體忽然破棺而出锄奢,到底是詐尸還是另有隱情,我是刑警寧澤剧腻,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布拘央,位于F島的核電站,受9級(jí)特大地震影響书在,放射性物質(zhì)發(fā)生泄漏灰伟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一儒旬、第九天 我趴在偏房一處隱蔽的房頂上張望栏账。 院中可真熱鬧,春花似錦栈源、人聲如沸挡爵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茶鹃。三九已至,卻和暖如春艰亮,著一層夾襖步出監(jiān)牢的瞬間闭翩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工迄埃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疗韵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓侄非,卻偏偏與公主長(zhǎng)得像蕉汪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彩库,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容