私たちは数学で多くの比較演算子を知っています。
JavaScript では次のように記述されます。
より大きい/より小さい: a > b 、 a < b 。
以上/以下: a >= b 、 a <= b 。
等しい: a == b 。2 つの等号==は等価性テストを意味し、1 つの等号a = b代入を意味することに注意してください。
等しくない: 数学では表記は≠ですが、JavaScript ではa != bと書かれます。
この記事では、重要な特徴を含め、さまざまなタイプの比較と、JavaScript による比較の実行方法について詳しく学びます。
最後には、「JavaScript の癖」関連の問題を回避するための良いレシピが見つかります。
すべての比較演算子はブール値を返します。
true – 「はい」、「正しい」、または「真実」を意味します。
false – 「いいえ」、「間違っている」、または「真実ではない」を意味します。
例えば:
アラート( 2 > 1 ); // true (正しい) アラート( 2 == 1 ); // false(間違っている) アラート( 2 != 1 ); // true (正しい)
比較結果は、他の値と同様に変数に割り当てることができます。
結果 = 5 > 4 とします。 // 比較結果を代入します アラート(結果); // 真実
ある文字列が別の文字列より大きいかどうかを確認するために、JavaScript はいわゆる「辞書」または「辞書編集」順序を使用します。
つまり、文字列は文字ごとに比較されます。
例えば:
アラート( 'Z' > 'A' ); // 真実 alert( 'グロー' > '歓喜' ); // 真実 アラート( '蜂' > '蜂' ); // 真実
2 つの文字列を比較するアルゴリズムは単純です。
両方の文字列の最初の文字を比較します。
最初の文字列の最初の文字が他の文字列より大きい (または小さい) 場合、最初の文字列は 2 番目の文字列より大きい (または小さい) ことになります。もう終わりです。
それ以外の場合、両方の文字列の最初の文字が同じであれば、同じ方法で 2 番目の文字を比較します。
いずれかの文字列の終わりまで繰り返します。
両方の文字列が同じ長さで終わる場合、それらは等しいことになります。それ以外の場合は、長い文字列の方が大きくなります。
上記の最初の例では、比較'Z' > 'A'最初のステップで結果を取得します。
2 番目の比較'Glow'と'Glee'では、文字列が文字ごとに比較されるため、さらに多くの手順が必要です。
G Gと同じです。
l lと同じです。
o eより大きいです。ここで止まって。最初の文字列の方が大きいです。
本物の辞書ではありませんが、Unicode の順序です
上記の比較アルゴリズムは、辞書や電話帳で使用されるものとほぼ同等ですが、まったく同じではありません。
たとえば、ケースが重要です。大文字の"A"小文字の"a"と等しくありません。どちらが大きいですか?小文字の"a" 。なぜ? JavaScript が使用する内部エンコード テーブル (Unicode) では、小文字のインデックスが大きいためです。これによる具体的な詳細と結果については、「文字列」の章で改めて説明します。
異なる型の値を比較する場合、JavaScript は値を数値に変換します。
例えば:
アラート( '2' > 1 ); // true、文字列 '2' は数値 2 になります アラート( '01' == 1 ); // true、文字列「01」は数値 1 になります
ブール値の場合、 true 1になり、 false 0になります。
例えば:
アラート( true == 1 ); // 真実 アラート( false == 0 ); // 真実
面白い結果
同時に次のことが考えられます。
2 つの値が等しい。
それらの 1 つはブール値としてtrueであり、もう 1 つはブール値としてfalseです。
例えば:
a = 0 とします。 アラート( Boolean(a) ); // 間違い b = "0" とします。 アラート( Boolean(b) ); // 真実 アラート(a == b); // 真実!
JavaScript の観点からすると、この結果はごく普通のことです。等価性チェックでは数値変換を使用して値が変換されます (したがって"0"は0になります)。一方、明示的なBoolean変換では別のルール セットが使用されます。
通常の等価性チェック==は問題があります。 0とfalseを区別することはできません。
アラート( 0 == false ); // 真実
空の文字列でも同じことが起こります。
アラート( '' == false ); // 真実
これは、異なる型のオペランドが等価演算子==によって数値に変換されるために発生します。 falseと同様に、空の文字列はゼロになります。
0とfalseを区別したい場合はどうすればよいでしょうか?
厳密な等価演算子===は、型変換を行わずに等価性をチェックします。
つまり、 aとb型が異なる場合、 a === b変換せずにすぐにfalse返します。
試してみましょう:
アラート( 0 === false ); // 型が違うので false
!=に類似した「厳密な非等価」演算子!==もあります。
厳密な等価演算子の記述は少し長くなりますが、何が起こっているかが明確になり、エラーが発生する余地が少なくなります。
nullまたはundefined他の値と比較すると、直感的ではない動作が発生します。
厳密な等価性チェックの場合===
それぞれが異なるタイプであるため、これらの値は異なります。
アラート( null === 未定義 ); // 間違い
厳密でないチェックの場合==
特別なルールがあります。これら 2 つは「甘いカップル」です。これらは ( ==の意味で) 互いに等しくなりますが、他の値は等しくありません。
アラート( null == 未定義 ); // 真実
数学やその他の比較の場合< > <= >=
null/undefinedは数値に変換されます。null null 0になり、 undefinedはNaNになります。
ここで、これらのルールを適用すると面白いことが起こることを見てみましょう。そして、さらに重要なのは、彼らの罠に陥らないようにする方法です。
nullとゼロを比較してみましょう。
アラート( null > 0 ); // (1) 偽 アラート( null == 0 ); // (2) false アラート( null >= 0 ); // (3) true
数学的に見て、それは奇妙です。最後の結果は「 nullはゼロ以上」であるため、上記の比較のいずれかがtrueある必要がありますが、両方とも false です。
その理由は、等価性チェック==と比較> < >= <=動作が異なるためです。比較ではnull数値に変換し、 0として扱います。そのため、(3) null >= 0は true、(1) null > 0 false になります。
一方、 undefinedとnullの等価性チェック==変換を行わずにそれらが互いに等しく、他とは等しくないように定義されます。そのため、(2) null == 0は false になります。
undefined値は他の値と比較すべきではありません。
アラート(未定義 > 0 ); // false (1) アラート(未定義 < 0 ); // false (2) アラート(未定義 == 0 ); // false (3)
なぜゼロはそこまで嫌われるのでしょうか?常に嘘だ!
このような結果が得られるのは次の理由からです。
比較(1)と(2)はfalseを返します。これは、 undefined NaNに変換され、 NaNすべての比較でfalse返す特別な数値であるためです。
等価性チェック(3)はfalseを返します。これは、 undefined null 、 undefinedのみに等しく、他の値には等しくないためです。
なぜこれらの例を調べたのでしょうか?私たちはこれらの特徴を常に覚えておくべきでしょうか?いや、そうではありません。実際、これらの扱いにくいことは時間の経過とともに徐々に慣れてきますが、これらの問題を回避する確実な方法があります。
厳密な等価===を除く、 undefined/nullとの比較は例外的に注意して処理してください。
何をしようとしているのかよくわからない場合は、 null/undefinedの可能性がある変数との比較>= > < <=を使用しないでください。変数にこれらの値が含まれる可能性がある場合は、個別に確認してください。
比較演算子はブール値を返します。
文字列は「辞書」の順序で文字ごとに比較されます。
異なる型の値が比較される場合、それらは (厳密な等価性チェックを除いて) 数値に変換されます。
nullとundefined値は互いに等しく== 、他の値とは等しくありません。
>や<などの比較を、 null/undefinedになる可能性のある変数と使用する場合は注意してください。 null/undefinedを個別にチェックすることをお勧めします。
重要度: 5
これらの式の結果はどうなるでしょうか?
5 > 4 「リンゴ」 > 「パイナップル」 「2」 > 「12」 未定義 == null 未定義 === null null == "n0n" null === +"n0n"
5 > 4 → 真 「リンゴ」 > 「パイナップル」 → false 「2」 > 「12」 → true 未定義 == null → true 未定義 === null → false null == "n0n" → false null === +"n0n" → false
理由のいくつかは次のとおりです。
明らかに、本当です。
辞書比較、したがって false。 "a"は"p"より小さいです。
再度、辞書を比較すると、最初の文字"2"は最初の文字"1"より大きくなります。
値nullとundefined互いにのみ等しいです。
厳密な平等は厳密です。両側の型が異なると false になります。
(4)と同様に、 null undefinedにのみ等しくなります。
異なるタイプの厳密な平等。