3 回答
TA貢獻1865條經驗 獲得超7個贊
如果你利用了它的==工作方式,你可以簡單地創建一個帶有自定義toString(或valueOf)函數的對象,該函數可以在每次使用時更改它返回的內容,使其滿足所有三個條件。
const a = {
i: 1,
toString: function () {
return a.i++;
}}if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');}這種方法的原因是由于使用了松散的等式運算符。當使用松散相等時,如果其中一個操作數與另一個操作數的類型不同,則引擎將嘗試將一個操作數轉換為另一個操作數。如果左邊是一個對象,右邊是一個數字,它會嘗試通過首先調用valueOf它來將對象轉換為數字,如果它是可調用的,如果失敗,它將調用toString。我toString在這種情況下使用的僅僅是因為它是我想到的,valueOf會更有意義。如果我改為返回一個字符串toString,那么引擎會嘗試將字符串轉換為一個數字,給出相同的最終結果,但路徑稍長。
TA貢獻2037條經驗 獲得超6個贊
我無法抗拒 - 其他答案無疑是正確的,但你真的無法超越以下代碼:
var a? = 1;var a = 2;var ?a = 3;if(a?==1 && a== 2 &&?a==3) {
console.log("Why hello there!")}請注意if語句中的奇怪間距(我從您的問題中復制)。它是半角度Hangul(對于那些不熟悉的人來說是朝鮮語),它是一個Unicode空格字符,ECMA腳本不將其解釋為空格字符 - 這意味著它是標識符的有效字符。因此,有三個完全不同的變量,一個是在a之后的韓文,一個是之前的,另一個只是一個。_為了便于閱讀,替換空格,相同的代碼如下所示:
var a_ = 1;var a = 2;var _a = 3;if(a_==1 && a== 2 &&_a==3) {
console.log("Why hello there!")}查看Mathias的變量名稱驗證器上的驗證。如果這個奇怪的間距實際上包含在他們的問題中,我確信這是這種答案的暗示。
不要這樣做。認真。
編輯:我注意到(盡管不允許啟動變量)零變寬連接器和零寬度非連接字符也允許在變量名中 - 請參閱使用零寬度字符混淆JavaScript - 優點和缺點?。
這將如下所示:
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貢獻1818條經驗 獲得超11個贊
有可能的!
var i = 0;with({
get a() {
return ++i;
}}) {
if (a == 1 && a == 2 && a == 3)
console.log("wohoo");}這在with語句中使用getter 來a評估三個不同的值。
...這仍然不意味著應該在實際代碼中使用...
更糟糕的是,這個技巧也適用于===。
var i = 0;
with({
get a() {
return ++i;
}
}) {
if (a !== a)
console.log("yep, this is printed.");
}添加回答
舉報
