2016-05-10 7 views
2
function foo(){ 
console.log(function(){return 1} <= function(){return 1}); 
} 
foo(); 

上記のコードは "true"を出力します。 < =と> =の両方に対してtrueを出力します。他のすべての演算子では「false」です。以下の場合、> =と<=演算子の動作を説明してください

ここではどんなトリックですか?

+0

@Sterling次のようにfalseが返されるため、関数のtoString()演算子が呼び出されているとは思わない: 'function(){return 1} == function(){return 1}' – harsh

+0

@Dmitriだからjavascriptは異なる> =、< - の場合はオペランドの変換ポリシー、他の場合は異なるポリシー? – harsh

+0

はい、 '=='と '==='の評価は、 '<=', '> ='、 '>'、 '<'とは異なります。 –

答えて

3

返された1を比較していないので、functionsと比較しています。ある関数に対して演算子を実行すると、暗黙的にtoStringが呼び出されます。

については、toStringは呼び出されていませんが、2つの異なるオブジェクトが決して同じではないため、オブジェクト比較が実行されます。

ここにはECMA specがあります。これは、比較演算子での比較演算子の操作方法を説明しています。オブジェクトの場合、instanceOfが使用されます。

+1

それは妥当と思われますが、JSにとっては奇妙なようです。これを説明する仕様のセクションを含めることはできますか? – ssube

+1

@ssube Dmitriは彼の答えで良いリンクを持っています –

-1

これは常に1 < = 1と比較しているので、それは本当です。 1> = 1を比較すると常に同じです。しかし、あなたが1> 1を比較するならば、それは偽です。

+0

申し訳ありませんが、あなたの質問は明確ではありません...しかし、私は以下のコメントを読んで – Patty

+0

これはまだ間違っている、それ自体は機能が実行されていないため)。比較は関数 –

+1

@Patty上で実行されています。この場合、あなたが記述するように働いています: '(function(){return 1})()<=(function(){return 1})()' –

2

function(){return 1} <= function(){return 1}は、プリミティブに関数を変換します。プリミティブに変換された関数は、文字列のコードに評価されます(toString()を呼び出します)。
"function(){return 1}" <= "function(){return 1}"は、文字列の比較が少ないか等しい比較を実行します(true)。

function(){return 1} == function(){return 1}でJavaScriptが関数オブジェクトを比較します。しかしこれらは異なるインスタンスなので、falseになります。

this articleで等価演算子の詳細を確認できます。

+0

Arg 、私はちょうどそれも見つけました。私の答えであなたを参照するつもりです。 +1 –

関連する問題