(a== 1 && a ==2 && a==3) 永遠為真嗎?
問題:
儘管有邏輯不一致,表達式(a== 1 && a ==2 && a==3) 在JavaScript 中能否求值為true?
理解表達式計算:
通常,表達式(a== 1 && a ==2 && a==3) 的計算結果總是false,因為'a' 的值不能同時為1、2、 3. 然而,JavaScript 的等式運算子(==) 在處理物件等非原始值時有一些怪癖。
自訂值轉換:
JavaScript 允許物件定義自己的toString() 或valueOf() 函數,這些函數用於將物件轉換為原始值以進行比較。透過利用這一點,可以建立一個每次轉換時都會更改其值的物件。
具有動態toString() 函數的自訂物件:
考慮以下內容object:
<code class="js">const a = { i: 1, toString: function () { return a.i++; } }</code>
該物件有一個屬性「i 」和一個自訂的toString() 函數。每次將物件轉換為原始值(例如,透過 == 或 console.log())時,都會呼叫 toString() 函數,傳回「i」的目前值並遞增它。
表達式求值技巧:
使用此自訂對象,表達式(a == 1 && a == 2 && a == 3) 現在可以求值為true:
<code class="js">if(a == 1 && a == 2 && a == 3) { console.log('Hello World!'); }</code>
第一次比較(a == 1) 回傳true,因為toString() 函數回傳1。第二次比較 (a == 2) 也傳回 true,因為再次呼叫 toString() 函數,傳回 2。同樣,第三個比較 (a == 3) 傳回 true,導致整個表達式計算結果為 true。
結論:
雖然看起來違反直覺,但實際上透過建立一個在轉換時動態更改其值的自訂對象,(a== 1 && a ==2 && a==3) 在JavaScript 中可以計算為true。這表示在處理 JavaScript 中的非原始值時可能會出現意外行為。
以上是JavaScript 的鬆散相等 (==) 能否使 (a == 1 && a == 2 && a == 3) 成立?的詳細內容。更多資訊請關注PHP中文網其他相關文章!