2016-04-28 12 views
2

これはただのJavaScriptの奇妙な癖かもしれないが、これはなぜ起こるか誰もが知っている場合、私は興味:オブジェクトが他のオブジェクトよりも大きいか小さいか

({} <= {}) => true

({} >= {}) => true

({} == {}) => false

({} === {}) => false

({} > {}) => false

({} < {}) => false

他のすべてが偽であると仮定すると、最初の2つはなぜ本当ですか?私はES5で</<=/>/>=の演算子を使用して

Number({}) >= Number({}) => false

+0

タイプキャストのルールは、 '=='と '<='/'> ='の間で異なります。 – Pointy

+2

より大きい、より小さい、そして[this](http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5)を読むことができます[ /www.ecma-international.org/ecma-262/5.1/#sec-11.9.3)について '==' – Pointy

答えて

2

それは比較の前の数字にオブジェクトをキャストすることができると思ったが、...

は空想であるAbstract Relational Comparison Algorithmを、使用していますそれを比較する前に型を強制すると言っている。 {}[[ToPrimitive]]に強制すると、toString()メソッドに戻ります。このメソッドは、"[object Object]"を返します。より小さい/より大きい演算子のequals-variantsは、最初に等しいかどうかを検査し、文字列が等しいので、検査は成功します。文字列が等しいため、非等価性検査バリアントでは失敗します。

==は同じ強制アルゴリズムを使用しません。Abstract Equality Comparison Algorithmを使用します。このアルゴリズムが最初にチェックするのは、型が同じである場合です。つまり、型が2つのオブジェクトの場合はもちろんです。したがって、アルゴリズムは最初のステップに進み、fを確認するために下がります。

xとyが同じオブジェクトを参照する場合はtrueを返します。それ以外の場合はfalseを返します。

{}を使用するたびに新しいオブジェクトが作成されるため、このチェックは失敗し、結果はfalseになります。

===は、強制ステップがないことを除いて同様です。 step 7で失敗します。これは、AECAのサブステップfと同じ言語を使用します。

tl; dr:>=/<=は、==/===とは異なる方法で強制する。

関連する問題