72

JavaScript の厳密な型比較演算子 ( ===, !==) は優れていますが、対応するより大なり小なりの厳密な比較はありません。

var x = 10;

x <= 20;    // true
x <= '20';    // true
x <== 20;   // true (or would be, if JS had such an operator)
x <== '20'; // false (ditto)

なぜだめですか?この質問は、答えが「ええと、そうではないから」であることを完全に期待していますが、そのような演算子が省略されている興味深いおよび/またはがっかりする歴史的理由がある場合に備えて、とにかく尋ねています。

4

5 に答える 5

38

私は推測することしかできません-


a === bが偽の場合、
a !== b真です。いつも

しかし、この意味は当てはまりません<==

が false の場合、型チェックや関係チェックで false になっている可能性があるため
x <== 20、 の結果を推測できません 。x >== 20

私はそれが少し紛らわしいと思いますが、言語にはもっと悪いことがたくさんあります (一般的な型強制など)。

<ただし、厳密または>一貫した動作になると思います。

于 2013-01-26T02:39:48.147 に答える
30

a === bは の省略形であるため、typeof a == typeof b && a == bこの展開を不等式に使用できますtypeof a == typeof b && a <= b。たとえば、

于 2013-01-26T02:00:46.860 に答える
6

あなたの質問に対する答えがあるかどうかわかりません。私の推測では、使用目的は数値を文字列 (およびおそらくブール値) と比較することです。非厳密等価演算子と同様に、実際にはこれらのケースで機能します。とにかく、それ以外のものは、任意の型強制規則の対象となります。の「正しい」出力は何でしょう[] < {}か? false? たぶんundefined?タイプが異なる必要さえなく、({foo: 1}) < {bar : 2}また意味がないことに注意してください。

私の意見では、彼ら (Brendan Eich とその後の ECMAScript 委員会) は、開発者が比較する意味のあるものだけを比較することを信頼することに決めただけです。あるいは、開発者がクレイジーな比較を試みるとは考えもしませんでした。比較のために余分な演算子を作成すると、言語が乱雑になるだけです。また、型強制を扱う際の落とし穴は比較だけではないことを忘れないでください。加算、減算などもあります。したがって、異なる型間での操作を許可するという決定に忠実であると判断しただけだと思います。彼らは、自分が何をしているのかを知っていれば人々の助けになると考えていましたが、そこから生じるすべての混乱を予期していなかったのかもしれません.

于 2013-01-26T03:21:25.020 に答える
0

問題は、さまざまな型に対して厳密な等価性を適切に定義できること (同じ型ではなく、等しくない) ですが、関係演算子をさまざまな型に対して適切に定義できないことです。

厳密なコンパレータa <== bを と定義するとしますtypeof a == typeof b && a <= b。についても同様ですa >== b。次に、a = "3" と b = 3 を比較すると、結果はa <== b偽、a >== b偽、a === b偽です。おめでとうございます。パラドックスが作成されました。

このような厳密なコンパレータは、ソート アルゴリズムや予期しない値の比較などを混乱させます。例えば:

for (var i; i <== list.count; i++) {
  doStuff(i);
}

list.countこの例では の代わりにlist.length誤って使用していることに注意してundefinedくださいi <== undefined.

list.countJavaScript が未定義のプロパティに対してエラーを発生させ、異なる型を比較す​​る場合は、はるかに良いでしょう。

私が言えるのはそれだけです。他のまともな言語と同じように、型を比較す​​ると例外が発生するはずです。しかし、そうではありません。

つまり、実際の実用的な解決策は、プリプロセッサの使用を開始するか、単に「まあ」と言って JavaScript を入力し続けることです。¯\_(ツ)_/¯

于 2016-05-06T03:02:16.090 に答える
0

それが意味をなさない理由を示すために、代わりに考えてみてください...

var x = 10
var less = (x <= 5)

さて、どちらも

x <== 5

x <== '5'

は誤りですが、理由は異なります。最初の例では、x > 5 という仮定を使用できますが、後者の場合は使用できません。誤った仮定を避けるには、最初に === または !== を使用し、その後で比較することをお勧めします。

于 2014-11-06T07:28:02.770 に答える