function foo(){
console.log(function(){return 1} <= function(){return 1});
}
foo();
上記のコードは "true"を出力します。 < =と> =の両方に対してtrueを出力します。他のすべての演算子では「false」です。以下の場合、> =と<=演算子の動作を説明してください
ここではどんなトリックですか?
function foo(){
console.log(function(){return 1} <= function(){return 1});
}
foo();
上記のコードは "true"を出力します。 < =と> =の両方に対してtrueを出力します。他のすべての演算子では「false」です。以下の場合、> =と<=演算子の動作を説明してください
ここではどんなトリックですか?
返された1
を比較していないので、functions
と比較しています。ある関数に対して演算子を実行すると、暗黙的にtoString
が呼び出されます。
については、toString
は呼び出されていませんが、2つの異なるオブジェクトが決して同じではないため、オブジェクト比較が実行されます。
ここにはECMA specがあります。これは、比較演算子での比較演算子の操作方法を説明しています。オブジェクトの場合、instanceOf
が使用されます。
それは妥当と思われますが、JSにとっては奇妙なようです。これを説明する仕様のセクションを含めることはできますか? – ssube
@ssube Dmitriは彼の答えで良いリンクを持っています –
これは常に1 < = 1と比較しているので、それは本当です。 1> = 1を比較すると常に同じです。しかし、あなたが1> 1を比較するならば、それは偽です。
申し訳ありませんが、あなたの質問は明確ではありません...しかし、私は以下のコメントを読んで – Patty
これはまだ間違っている、それ自体は機能が実行されていないため)。比較は関数 –
@Patty上で実行されています。この場合、あなたが記述するように働いています: '(function(){return 1})()<=(function(){return 1})()' –
function(){return 1} <= function(){return 1}
は、プリミティブに関数を変換します。プリミティブに変換された関数は、文字列のコードに評価されます(toString()
を呼び出します)。
"function(){return 1}" <= "function(){return 1}"
は、文字列の比較が少ないか等しい比較を実行します(true
)。
function(){return 1} == function(){return 1}
でJavaScriptが関数オブジェクトを比較します。しかしこれらは異なるインスタンスなので、false
になります。
this articleで等価演算子の詳細を確認できます。
Arg 、私はちょうどそれも見つけました。私の答えであなたを参照するつもりです。 +1 –
@Sterling次のようにfalseが返されるため、関数のtoString()演算子が呼び出されているとは思わない: 'function(){return 1} == function(){return 1}' – harsh
@Dmitriだからjavascriptは異なる> =、< - の場合はオペランドの変換ポリシー、他の場合は異なるポリシー? – harsh
はい、 '=='と '==='の評価は、 '<=', '> ='、 '>'、 '<'とは異なります。 –