21

私は同僚に、JavaScriptで変数を比較するときに使用する必要があることを説明していました。これ===により!==、引数が強制されたり、すべてがばかげて混乱したりすることはありませんが、彼らは私が知らなかった2つの部分からなる質問をしました。私がここで専門家に尋ねると思った答えは、具体的には次のとおりです。>==<==

どうですか-それらを比較する><、引数も強制するかどうか-ある種の演算子がないのはなぜ>>ですか<<(おそらく、ビットシフト演算子になると思うので、他の構文が必要です全体のCスタイルですが、要点はわかります)?

だから私は最初の部分への答えを見つけるためにテストを書くことができます、これはここにあります:

// Demo the difference between == and ===
alert(5 == "5");
alert(5 === "5");   

// Check out what happens with >
alert(5 > "4");    
alert(5 > 4);

そしてそれは戻った:

true
false

true
true

>したがって、は強制を実行しているように見え、同じ結果> "4"> 4返します。では、2番目の部分はどうですか...

タイプを強制しない、ある種の演算子はあります>か(または、テストを安全に実行するためにテストを変更するにはどうすればよいですか)?<

4

4 に答える 4

19

いいえ、そのような演算子は必要ありません。これらの関係演算子に対して行われる型チェックは、等値および不等値とは異なります。(編集— おそらく、「必要ない」と言うのは少し強いかもしれません。それは、JavaScript がそう判断しているという理由だけで真実です :-)

具体的には、>and<および>=and<=演算子はすべて、2 つの数値または 2 つの文字列のいずれかを操作し、数値を優先します。つまり、一方の値が数値の場合、もう一方の値は数値として扱われます。非数値をきれいに数値に変換できない場合 (つまり、最終的に になる場合NaN)、比較の結果は になりundefinedます。(ステートメントのコンテキストでは のundefinedように見えるため、これは少し問題です。)falseif

両方の値が文字列の場合、代わりに照合順序の文字列比較が実行されます。

考えてみれば、これらの比較はオブジェクト インスタンスには何の意味もありません。オブジェクトが別のオブジェクトよりも「大きい」とはどういう意味ですか? おそらく、これは、バリアント型の値がこのように比較され、それが問題を引き起こしていることに気付いた場合、その状況を自分で検出する必要があることを意味していると思います。そのような状況につながるコードに何か怪しいものがないか、上流で考えてみるとよいと思います。

于 2012-08-27T14:04:46.670 に答える
11

タイプを強制しない>と<のある種の演算子はありますか

いいえ。

テストを安全に実行するためにテストを変更するにはどうすればよいですか

タイプを明示的にテストする必要があります。

typeof a === typeof b && a > b
于 2012-08-27T14:07:39.753 に答える
1

FlanaganのJavaScript:The Definitive Guide(5th Ed。)を参照しましたが、非強制的な比較演算子はないようです。

<<と>>は確かにビット演算子であるため、機能しないと言っているのは正しいです。

私はあなたが故意にあなた自身の価値を強制することを提案します:

var num_as_string = '4';
var num = +num_as_string;
if (5 > num) { ... }
于 2012-08-27T14:12:16.597 に答える