私は奇妙なことについて質問したいと思います、すなわち:
var x = "pl";
var y = ["pl"];
[x] == y; // false - why?
x == y; // true - how ?
x === y; // false - okay
誰かがそれを説明できますか?
前もって感謝します。
私は奇妙なことについて質問したいと思います、すなわち:
var x = "pl";
var y = ["pl"];
[x] == y; // false - why?
x == y; // true - how ?
x === y; // false - okay
誰かがそれを説明できますか?
前もって感謝します。
2つの配列(オブジェクト)を比較しているため、最初の配列はfalseです-オブジェクトが実際に同じオブジェクトでない限り、またはオブジェクトが2番目のように異なるタイプの値に強制変換されている場合を除いて、比較は常にfalseになります比較。
2番目の比較では、yは強制的に文字列値になり、次に。に等しいことがわかります"pl"
。
たとえば、次のコードは次のとおりです。
["pl"] + "foo" → "plfoo"
ちなみに、これが===
代わりに常に使用する必要がある理由です==
-それは驚くべき強制をもたらすことはありません。そのため、3番目の比較は誤りです。
配列から配列へ(抽象的な等式比較)
[x] == y; // false - why?
[x]
同じオブジェクトを参照しy
ないでください。配列はオブジェクトであり、演算子は、すべてのプロパティに対して同じ値を持つ2つのオブジェクトではなく、それらが同じ==
オブジェクトであることをテストします。この方法でオブジェクトの同等性を判断するには、各オブジェクトのプロパティを手動で列挙し、各値をテストする必要があります。
によって使用される抽象的な等式比較アルゴリズムによると==
:
xとyが同じオブジェクトを参照している場合は、trueを返します。それ以外の場合は、falseを返します。
文字列と配列(抽象的等式比較)
x == y; // true - how ? oO
y
==
配列を文字列と比較するときに使用したため、配列は文字列に強制変換されx
ます。
によって使用される抽象的な等式比較アルゴリズムによると==
:
Type(x)がStringまたはNumberのいずれかであり、Type(y)がObjectの場合、比較の結果x == ToPrimitive(y)を返します。
文字列と配列(厳密な等式比較)
x === y; // fasle - okey
===
とは異なり==
、文字列に強制変換されませんy
...したがって、文字列をオブジェクトと比較しています。
によって使用される厳密な等式比較アルゴリズムによると===
:
Type(x)がType(y)と異なる場合は、falseを返します。
[x] == y;
['pl']==['p1']-メモリ内の2つの異なる配列の参照を比較します
x == y;
"pl" == ["p1"]。toString()と同じです。最初の引数も文字列であるため、JSは2番目の引数を文字列に変換します