3 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果你利用了它的==
工作方式,你可以簡單地創(chuàng)建一個(gè)帶有自定義toString
(或valueOf
)函數(shù)的對(duì)象,該函數(shù)可以在每次使用時(shí)更改它返回的內(nèi)容,使其滿足所有三個(gè)條件。
const a = { i: 1, toString: function () { return a.i++; }}if(a == 1 && a == 2 && a == 3) { console.log('Hello World!');}
這種方法的原因是由于使用了松散的等式運(yùn)算符。當(dāng)使用松散相等時(shí),如果其中一個(gè)操作數(shù)與另一個(gè)操作數(shù)的類型不同,則引擎將嘗試將一個(gè)操作數(shù)轉(zhuǎn)換為另一個(gè)操作數(shù)。如果左邊是一個(gè)對(duì)象,右邊是一個(gè)數(shù)字,它會(huì)嘗試通過首先調(diào)用valueOf
它來將對(duì)象轉(zhuǎn)換為數(shù)字,如果它是可調(diào)用的,如果失敗,它將調(diào)用toString
。我toString
在這種情況下使用的僅僅是因?yàn)樗俏蚁氲降模?code>valueOf會(huì)更有意義。如果我改為返回一個(gè)字符串toString
,那么引擎會(huì)嘗試將字符串轉(zhuǎn)換為一個(gè)數(shù)字,給出相同的最終結(jié)果,但路徑稍長。

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
我無法抗拒 - 其他答案無疑是正確的,但你真的無法超越以下代碼:
var a? = 1;var a = 2;var ?a = 3;if(a?==1 && a== 2 &&?a==3) { console.log("Why hello there!")}
請(qǐng)注意if
語句中的奇怪間距(我從您的問題中復(fù)制)。它是半角度Hangul(對(duì)于那些不熟悉的人來說是朝鮮語),它是一個(gè)Unicode空格字符,ECMA腳本不將其解釋為空格字符 - 這意味著它是標(biāo)識(shí)符的有效字符。因此,有三個(gè)完全不同的變量,一個(gè)是在a之后的韓文,一個(gè)是之前的,另一個(gè)只是一個(gè)。_
為了便于閱讀,替換空格,相同的代碼如下所示:
var a_ = 1;var a = 2;var _a = 3;if(a_==1 && a== 2 &&_a==3) { console.log("Why hello there!")}
查看Mathias的變量名稱驗(yàn)證器上的驗(yàn)證。如果這個(gè)奇怪的間距實(shí)際上包含在他們的問題中,我確信這是這種答案的暗示。
不要這樣做。認(rèn)真。
編輯:我注意到(盡管不允許啟動(dòng)變量)零變寬連接器和零寬度非連接字符也允許在變量名中 - 請(qǐng)參閱使用零寬度字符混淆JavaScript - 優(yōu)點(diǎn)和缺點(diǎn)?。
這將如下所示:
var a= 1;var a?= 2; //one zero-width charactervar a??= 3; //two zero-width characters (or you can use the other one)if(a==1&&a?==2&&a??==3) { console.log("Why hello there!")}

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
有可能的!
var i = 0;with({ get a() { return ++i; }}) { if (a == 1 && a == 2 && a == 3) console.log("wohoo");}
這在with
語句中使用getter 來a
評(píng)估三個(gè)不同的值。
...這仍然不意味著應(yīng)該在實(shí)際代碼中使用...
更糟糕的是,這個(gè)技巧也適用于===
。
var i = 0; with({ get a() { return ++i; } }) { if (a !== a) console.log("yep, this is printed."); }
添加回答
舉報(bào)