5

次の比較はすべてfalseJavaScript で返されます。

[]===[]
[]==[]
{}==={}
{}=={} 
[0]===[0]
[0]==[0]

ただし、次の戻り値true:

[0]=='0'
[0]==0
[]==false //(and all other == that were exampled above)

これの理由は何ですか?[0]!=[0]特にとの違い[0]==0

フィドル: http://jsfiddle.net/vnBVj/

4

3 に答える 3

9

これは、javascript がどのように型強制を行うかという紛らわしい規則によるものです。これについては、EcmaScript 5 仕様の§11.9.3で読むことができます。

2 つのオブジェクト (配列も同様) は決して等しくないため、最初のブロックでのすべての比較は false になります (§11.9.3.1.c.vi)

2 番目のブロックはより困難です。

最初に知っておくべきことは、==型強制を使用してオペランドを比較することです。

比較にブール値が含まれる場合、これは最初に数値に強制されます。

[]==false
[]==0

その後、オブジェクトは呼び出しによってプリミティブ値に強制されますObject.prototype.toString

"" == 0

次に、文字列は数値に強制されます(""になります0

0 == 0

true を返します。同じルールを適用すると、他の例も true になる理由がわかります。

===型強制が発生することはありませんが、最初に正しい型をチェックし、それらが等しくない場合は false を返すことに注意してください! タイプが等しい場合にのみ、実際の値を比較します。したがって、この比較方法は よりもはるかに信頼性が高くなり==ます。

于 2012-12-13T09:25:03.280 に答える
4

結果のすべての例はfalse、オブジェクトを比較している場合 (および配列は特別なオブジェクトです)、JavaScript はオブジェクト参照を比較するという事実によって簡単に説明できます。これらすべての比較で新しいオブジェクトを作成しているため、すべてが異なるオブジェクトを指すため、結果はfalse.

について[0]=='0'は、一方のオペランドが文字列になるとすぐに、もう一方も文字列に変換されます。の文字列変換[0]'0'であるため、結果は true です。

同じことが、1 つのオペランドが数値またはブール値である場合にも当てはまり、最後の 2 つの比較の結果が説明されます。

詳細については、それぞれの MDN ページをご覧ください。

重要な部分を引用:

等しい (==)

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

于 2012-12-13T09:24:36.073 に答える
3

リテラル配列/オブジェクトの初期化を使用すると、空であっても新しいオブジェクトが作成され、その参照が返されます。したがって、それらを比較するときは、作成したオブジェクトの参照の値を比較します。

異なるタイプの変数を比較しているため、他の例は true を返します。そのため、オブジェクト/配列はそれらと比較できるように変換されます。

于 2012-12-13T09:25:55.580 に答える