比較演算子

概要

比較演算子は 2 つの値の大きさを比較するために使用され、指定された条件が満たされるかどうかを示すブール値を返します。

2 > 1 // true

上記のコードは、「2」が「1」より大きいかどうかを比較し、「true」を返します。

比較演算子は数値だけでなく、さまざまなタイプの値を比較できることに注意してください。

JavaScript には、合計 8 つの比較演算子が用意されています。

  • > より大きい演算子
  • < より小さい演算子
  • <= 以下演算子
  • >= 以上の演算子
  • == 等価演算子
  • === 厳密等価演算子
  • != 不等号演算子
  • !== 厳密な不等号演算子

これら 8 つの比較演算子は、等価比較と非等価比較の 2 つのカテゴリに分類されます。 2 つの等しくない比較の場合、アルゴリズムは最初に 2 つの演算子が両方とも文字列であるかどうかをチェックし、文字列である場合は辞書順に比較し、それ以外の場合は両方の演算子を数値に変換します。を選択し、数値を比較します。

非等価演算子: 文字列の比較

文字列は辞書編集順に比較されます。

'猫' > '犬' // false
'cat' > 'catalog' // false

JavaScript エンジンは内部的に最初の文字の Unicode コード ポイントを比較します。それらが等しい場合は、2 番目の文字の Unicode コード ポイントが比較され、以下同様に続きます。

'猫' > '猫' // true'

上記のコードでは、小文字 c の Unicode コード ポイント (99) が大文字 C の Unicode コード ポイント (67) より大きいため、true が返されます。

すべての文字には Unicode コード ポイントがあるため、中国語の文字も比較できます。

'大きい' > '小さい' // false

上記のコードでは、「大きい」Unicode コード ポイントは 22823、「小さい」は 23567 であるため、false が返されます。

非等価演算子: 非文字列の比較

2 つの演算子のうち少なくとも 1 つが文字列でない場合は、次の 2 つの状況に分ける必要があります。

(1) プリミティブ型の値

両方の演算子がプリミティブ型の値である場合は、まず数値に変換されてから比較されます。

5 > '4' // true
// 5 > Number('4') と同等
// つまり 5 > 4

true > false // true
// Number(true) > Number(false) と同等
// つまり 1 > 0

2 > true // true
// 2 > Number(true) と同等
// つまり 2 > 1

上記のコードでは、文字列とブール値は数値に変換されてから比較されます。

ここで注意する必要があるのは「NaN」との比較です。非等価演算子を使用して NaN と比較した値 (NaN 自体を含む) はすべて false を返します。

1 > NaN // false
1 <= NaN // false
'1' > NaN // false
'1' <= NaN // false
NaN > NaN // false
NaN <= NaN // false

(2)オブジェクト

演算子がオブジェクトの場合は、プリミティブ型の値に変換されて比較されます。

オブジェクトをプリミティブ型の値に変換するには、アルゴリズムは最初に valueOf メソッドを呼び出します。返されたオブジェクトがまだオブジェクトである場合は、次に toString メソッドを呼び出します。詳細については、この章を参照してください。 「データ型変換」。

var x = [2];
x > '11' // true
// [2].valueOf().toString() > '11' と同等
// つまり '2' > '11'

x.valueOf = function () { return '1' };
x > '11' // false
// (function () { return '1' })() > '11' と同等
// つまり '1' > '11'

2 つのオブジェクト間の比較についても同様です。

[2] > [1] // true
// [2].valueOf().toString() > [1].valueOf().toString() と同等
// つまり '2' > '1'

[2] > [11] // true
// [2].valueOf().toString() > [11].valueOf().toString() と同等
// つまり '2' > '11'

({ x: 2 }) >= ({ x: 1 }) // true
// ({ x: 2 }).valueOf().toString() >= ({ x: 1 }).valueOf().toString() と同等
// つまり、'[オブジェクト オブジェクト]' >= '[オブジェクト オブジェクト]'

厳密な等価演算子

JavaScript には、「==」と「===」という 2 つの等価演算子が用意されています。

簡単に言えば、両者の違いは、等価演算子 (==) は 2 つの値が等しいかどうかを比較するのに対し、厳密等価演算子 (===) はそれらが「同じ値」であるかどうかを比較することです。 2 つの値が同じ型ではない場合、厳密等価演算子 (===) は直接 false を返しますが、等価演算子 (==) はそれらを同じ型に変換します。厳密な等価演算子を使用して比較を行います。

このセクションでは、厳密等価演算子のアルゴリズムについて説明します。

(1) さまざまな種類の値

2 つの値の型が異なる場合は、直接 false を返します。

1 === "1" // false
true === "true" // false

上記のコードは、数値 1 を文字列 "1" と比較し、ブール値 true を文字列 "true" と比較します。型が異なるため、結果はすべて false` になります。

(2)同じクラスのプリミティブ型の値

同じ型のプリミティブ型の値(数値、文字列、ブール値)を比較した場合、値が同じであればtrueを返し、値が異なる場合にはfalseを返します。

1 === 0x1 // true

上記のコードは、10 進数の 1 と 16 進数の 1 を比較します。型と値が同じなので、true を返します。

'NaN' はどの値 (それ自体も含む) と等しくないことに注意してください。また、正の '0' は負の '0' と同じです。

NaN === NaN // false
+0 === -0 // true

(3) 複合型の値

2 つの複合型 (オブジェクト、配列、関数) のデータを比較する場合、それらの値が等しいかどうかを比較するのではなく、それらが同じアドレスを指しているかどうかを比較します。

{} === {} // false
[] === [] // false
(function () {} === function () {}) // false

上記のコードは、2 つの空のオブジェクト、2 つの空の配列、および 2 つの空の関数をそれぞれ比較しますが、結果は等しくありません。その理由は、複合型の値の場合、厳密な等価演算では同じメモリ アドレスを参照しているかどうかが比較されるのに対し、演算子の両側にある空のオブジェクト、空の配列、空の関数の値はすべて異なるメモリに格納されるためです。結果はもちろん「偽」です。

2 つの変数が同じオブジェクトを参照している場合、それらは等しいです。

var v1 = {};
var v2 = v1;
v1 === v2 // true

2 つのオブジェクト間の比較では、厳密等価演算子はアドレスを比較し、大なり演算子または小なり演算子は値を比較することに注意してください。

var obj1 = {};
var obj2 = {};

obj1 > obj2 // false
obj1 < obj2 // false
obj1 === obj2 // false

上記の 3 つの比較のうち、最初の 2 つは値を比較し、最後の比較はアドレスを比較するため、すべて「false」を返します。

(4) 未定義および null

unknownnull は厳密にそれ自体と同じです。

未定義 === 未定義 // true
null === null // true

変数宣言後のデフォルト値は「未定義」であるため、宣言されただけで値が代入されていない 2 つの変数は等しいことになります。

var v1;
var v2;
v1 === v2 // true

厳密な不等号演算子

厳密な等価演算子には、対応する「厳密な等価演算子」 (!==) があり、そのアルゴリズムは、最初に厳密な等価演算子の結果を見つけてから、反対の値を返すことです。

1 !== '1' // true
// と同等
!(1 === '1')

上記のコードでは、感嘆符 ! を使用して、次の式の反対の値を検索します。

##等価演算子

等価演算子は、同じ型のデータを比較するために使用される場合、厳密な等価演算子とまったく同じように機能します。

1==1.0
// と同等
1 === 1.0

異なる型のデータを比較する場合、等価演算子はまずデータ型を変換し、次にそれを厳密等価演算子と比較します。以下では、さまざまな種類の値を相互に比較するためのルールについて説明するために、いくつかの状況に分けて説明します。

(1) プリミティブ型の値

プリミティブ型の値を数値に変換して比較します。

1 == true // true
// 1 === Number(true) と同等

0 == false // true
// 0 と同等 === 数値(false)

2 == true // false
// 2 と同等 === Number(true)

2 == false // false
// 2 === Number(false) と同等

'true' == true // false
// Number('true') === Number(true) と同等
// NaN === 1 と同等

'' == 0 // true
// Number('') === 0 と同等
// 0 === 0 と同等

'' == false // true
// Number('') === Number(false) と同等
// 0 === 0 と同等

'1' == true // true
// Number('1') === Number(true) と同等
// 1 === 1 に相当

'\n 123 \t' == 123 // true
// 文字列を数値に変換する際、先頭と末尾のスペースが省略されるため

上記のコードは、文字列とブール値の両方を数値に変換して比較します。特定の文字列およびブール型の変換規則については、「データ型変換」の章を参照してください。

(2) オブジェクトとプリミティブ型の値の比較

オブジェクト (ここでは、配列や関数を含む一般化されたオブジェクトを指します) がプリミティブ型の値と比較される場合、オブジェクトはプリミティブ型の値に変換されて比較されます。

具体的には、最初にオブジェクトの valueOf() メソッドを呼び出し、元の型の値が取得されている場合は、前のセクションの規則に従って相互に比較し、オブジェクトがまだ取得されている場合は を呼び出します。 toString() メソッドを使用して文字列形式を取得し、比較します。

以下は、配列とプリミティブ値を比較する例です。

//配列と数値の比較
[1] == 1 // true

//配列と文字列の比較
[1] == '1' // true
[1, 2] == '1,2' // true

//オブジェクトとブール値の比較
[1] == true // true
[2] == true // false

上記の例では、JavaScript エンジンは最初に配列 [1]valueOf() メソッドを呼び出します。戻り値は依然として配列であるため、次に配列の toString() メソッドを呼び出します。次に、前のセクションのルールに従って比較します。

より直接的な例を次に示します。

const obj = {
  値の: 関数 () {
    console.log('valueOf() を実行');
    オブジェクトを返します。
  }、
  toString: function () {
    console.log('toString() を実行');
    「foo」を返します;
  }
};

obj == 'ふー'
//valueOf()を実行
//toString()を実行
// 真実

上の例では、obj はカスタマイズされた valueOf() メソッドと toString() メソッドを持つオブジェクトです。このオブジェクトが文字列 'foo' と比較されると、valueOf() メソッドと toString() メソッドが順番に呼び出され、最後に 'foo' が返されるため、比較結果は true になります。 。

(3) 未定義および null

unknownnull は、それ自体または相互に比較した場合にのみ true を返します。他の型の値と比較した場合、結果は false になります。

未定義 == 未定義 // true
null == null // true
未定義 == null // true

false == null // false
false == 未定義 // false

0 == null // false
0 == 未定義 // false

(4) 等価演算子のデメリット

等価演算子によって隠蔽された型変換により、直観に反する結果が生じる可能性があります。

0 == '' // true
0 == '0' // 真

2 == true // false
2 == false // false

false == 'false' // false
false == '0' // true

false == 未定義 // false
false == null // false
null == 未定義 // true

' \t\r\n ' == 0 // true

上記の表現は直感とは異なり、間違いやすいものです。したがって、等価演算子 (==) は使用しないことをお勧めします。厳密な等価演算子 (===) のみを使用することをお勧めします。

不等演算子

等価演算子には、対応する「不等価演算子」 (!=) があり、そのアルゴリズムは、まず等価演算子の結果を見つけてから、反対の値を返すことです。

1 != '1' // false

// と同等
!(1 == '1')

作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0