(a== 1 && a ==2 && a==3) は真実ですか?
質問:
論理的矛盾があるにもかかわらず、JavaScript で式 (a== 1 && a ==2 && a==3) が true と評価されることはありますか?
式を理解する評価:
通常、式 (a== 1 && a ==2 && a==3) は常に false と評価されます。これは、'a' の値が同時に 1、2、および 3. ただし、JavaScript の等価演算子 (==) は、オブジェクトなどの非プリミティブ値を扱う場合にいくつかの癖があります。
カスタム値変換:
JavaScript ではオブジェクトが許可されます独自の toString() 関数または valueOf() 関数を定義します。これらの関数は、比較目的でオブジェクトをプリミティブ値に変換するために使用されます。これを利用すると、変換されるたびに値が変わるオブジェクトを作成できます。
Dynamic 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>
toString() 関数が 1 を返すため、最初の比較 (a == 1) は true を返します。 toString() 関数が再度呼び出され、2 が返されるため、2 番目の比較 (a == 2) も true を返します。 、3 番目の比較 (a == 3) は true を返し、その結果、式全体が true に評価されます。
結論:
直観に反しているように思えるかもしれませんが、実際は次のとおりです。変換時に値を動的に変更するカスタム オブジェクトを作成することで、JavaScript で (a== 1 && a ==2 && a==3) を true と評価することができます。これは、JavaScript で非プリミティブ値を扱うときに予期しない動作が発生する可能性があることを示しています。
以上がJavaScript の緩やかな等価性 (==) は (a == 1 && a == 2 && a == 3) を真にしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。