您好,登錄后才能下訂單哦!
這篇文章主要講解了“javascript中如何讓“a==1&&a==2&&a==3”成立”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“javascript中如何讓“a==1&&a==2&&a==3”成立”吧!
if (a == 1 && a == 2 && a == 3) {
console.log('Win')
}
如何讓if里面的代碼執(zhí)行,成功在控制臺打印出Win
?
看到題目的第一眼,我是蒙蔽的.怎么可能會有如此矛盾的情況發(fā)生呢?就相當(dāng)于一個人怎么可能即是小孩,又是成年人,還是老年人呢?
冷靜下來,發(fā)現(xiàn)一些端倪。
它沒說讓a同時(shí)等于1 2 3。
而且js是單線程運(yùn)行的。 即使它們寫在了一行,那也是從左到右執(zhí)行的. 所以它們從時(shí)空上面就不是同一時(shí)期的東西。
既然不是同一時(shí)期的東西,那么一個人當(dāng)然可以是可以成為小孩子,之后成為過成年人,然后變成老年人了。
回到題目,那么我想要讓這個條件成立,就需要獲取一次a的同時(shí),讓它自增1。
第一種方法,利用判斷過程中的[隱式轉(zhuǎn)換]的toString
方法。在我的另外一篇為什么[] == ![]結(jié)果為true?中詳細(xì)闡述過。
const a = {
_a: 0,
toString: function() {
return ++a._a
}
}
運(yùn)行一次,就給_a加1,然后返回.
因?yàn)閠oString是Object.prototype
上面默認(rèn)的方法,所以這個辦法相當(dāng)于把正常的隱式轉(zhuǎn)換中toString
方法給攔截了。
涉及原型和原型鏈的知識點(diǎn)
問題是可以解決了。
評論區(qū)的有掘友說讓 a = true 也可以解決的。確實(shí)很有誤導(dǎo)性。其實(shí)是混淆了隱式轉(zhuǎn)化的優(yōu)先級。簡單來說,隱式轉(zhuǎn)化是由兩部分組成:轉(zhuǎn)化的規(guī)則 + 觸發(fā)轉(zhuǎn)化的條件。if
包著的里面整體觸發(fā)了Boolean()
的轉(zhuǎn)化規(guī)則,==
又字符串在右側(cè)觸發(fā)toString()
的轉(zhuǎn)化規(guī)則。
回到這題,==
的右邊是數(shù)字,JS運(yùn)行線路是從左到右的。所以,這個時(shí)候觸發(fā)的是Number()
的規(guī)則,把左側(cè)的true
轉(zhuǎn)化為1
之后,兩邊類型一致之后,那自然不會再觸發(fā)什么規(guī)則了,此時(shí)已經(jīng)不構(gòu)成隱式轉(zhuǎn)化。所以說1 == 1 && 1 == 2 && 1 == 3
是不成立的。
現(xiàn)在記住了,也比面試過程中的時(shí)候再來記好
現(xiàn)在將題目簡單修改一下,將雙等變成三個等怎么辦?
大家都知道===
的話是先判斷類型,再判斷值。這里的toString
已經(jīng)默認(rèn)把對象轉(zhuǎn)化為字符串了.使用toStirng
的話,結(jié)果就不成立了.
使用對象的數(shù)據(jù)攔截法:
Object.defineProperties(window, {
_a: {
value: 0,
writable: true
},
a: {
get: function() {
return ++_a
}
}
})
感謝各位的閱讀,以上就是“javascript中如何讓“a==1&&a==2&&a==3”成立”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對javascript中如何讓“a==1&&a==2&&a==3”成立這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。