1. ホーム
  2. javascript

[解決済み] 1==1==1 は真を、"1"=="1"=="1 "は真を、"a"=="a"=="a "は偽を返すのはなぜか?重複

2022-10-13 22:04:10

質問

function a() { return (1 == 1 == 1); }
function b() { return ("1" == "1" == "1"); }
function c() { return ("a" == "a" == "a"); }

上記のコードをChromeのコンソールでテストしてみたところ、なぜか a() は真を返します。 b() は真を返し、そして c() は偽を返します。

なぜそうなるのでしょうか?

どのように解決するのですか?

1つ目の等式の(ブール値)結果と3つ目の(非ブール値)値を比較しているからです。

コードでは 1 == 1 == 1 と同じです。 (1 == 1) == 1 と同じです。 true == 1 .

つまり、3つのメソッドはよりシンプルに次のように書くことができます。

function a() { return (true == 1); }
function b() { return (true == "1"); }
function c() { return (true == "a"); }

これらの比較は、以下のように動作します。 これらのルール (強調)に従って動作します。

2 つのオペランドが同じ型でない場合、JavaScript はオペランドを変換します。 オペランドを変換し、厳密な比較を適用します。オペランドのどちらかが 数値またはブーリアンである場合、オペランドは可能であれば数値に変換されます。 可能 オペランドが文字列の場合は、文字列オペランドは可能な限り数値に変換されます。 は数値に変換されます。オペランドの両方がオブジェクトの場合 JavaScript は、オペランドがメモリ上の同じオブジェクトを参照している場合、等しい内部参照を比較します。 がメモリ内の同じオブジェクトを参照している場合、JavaScript は内部参照を比較します。

で何が起こるかというと c は、つまり "a" が数値に変換されることです(これにより NaN を与える)、その結果は 厳密に比較すると になります。 true は数値に変換されます。 1 ).

から 1 === NaNfalse であれば、3番目の関数は false . 最初の2つの関数がなぜ true .