if条件と等しい演算子判定規則
4475 ワード
Javascriptの初心者として、if判定文と==等価演算子の演算規則はかなり頭が大きいので、関連資料を調べて、もう一度まとめます.
等数演算子の判定規則
==と==
JavaScriptは、2つの等しい演算子を提供します.==と==です.
簡単に言えば、それらの違いは、等しい演算子(=)が、2つの値が等しいかどうかを比較し、厳密に等しい演算子(==)が「同じ値」かどうかを比較します.2つの値が同じタイプではない場合、厳密に等しい演算子(==)は直接falseに戻り、等しい演算子(=)はそれらを同じタイプに変換し、厳密に等しい演算子で比較します.
ここでは主に==と==のいくつかの判断ルールについて説明します.
厳密に等しい演算子
(1)異なるタイプの値が2つの値の種類が異なる場合、直接falseに戻ります.
同じタイプの元のタイプの値(数値、文字列、ブール値)を比較すると、同じ値でtrueを返します.値が違うとfalseに戻ります.
NaNは、自身を含むいかなる値とも等しくないことに留意されたい.また、正0は負0となります.
二つの複合タイプ(オブジェクト、配列、関数)のデータ比較では、それらの値が等しいかどうかを比較するのではなく、それらが同じアドレスを指すかを比較します.
二つの変数が同じオブジェクトを参照すると、それらは同じです.
(4)undefinedとnull
undefinedとnullは自分自身の厳しさと同じです.
undefined==undefined//true null==null/trueは変数宣言後のデフォルト値がundefinedであるため、二つの宣言は未割り当て変数のみが等しいです.
厳密に等しい演算子には、対応する「厳密には等しくない演算子」があります.そのアルゴリズムは、厳密に等しい演算子の結果を求めて、逆の値を返します.
等しい演算子が同じ種類のデータを比較するときは、厳密に等しい演算子と同じです.
異なるタイプのデータを比較する場合、等しい演算子はまずデータをタイプ変換し、厳密な等しい演算子で比較します.タイプ変換規則は以下の通りです.
(1)元のタイプの値
元のタイプのデータを数値に変換して比較します.
(2)オブジェクトと元のタイプの値の比較
オブジェクト(ここでは一般化のオブジェクトを指し、配列と関数を含む)が元のタイプの値と比較した場合、オブジェクトは元のタイプの値に変換され、比較されます.
(3)undefinedとnull
undefinedとnullは他のタイプの値と比較した場合、結果はすべてfalseであり、それらが互いに比較した場合、結果はtrueである.
(4)等しい演算子の欠点
等数演算子の隠しタイプの変換は、直感に反する結果をもたらします.
(5)等しくない演算子
等数演算子には対応する「不等分演算子」があります.両者の演算結果は正反対です.
ここのif(xxx)で条件文に対する判断は、非ブール値のパラメータを自動的にブール値に変換します.ここでは自動的にブール値に変換する場合をまとめます.
ブール値に自動変換
以下の5つの値を除いて、他は自動的にtrueになります. undefined null +0または-0 NaN '(空の文字列) 以下の例では、条件部分の各値はfalseに相当し、否定演算子を使ってtrueになります.
等数演算子の判定規則
==と==
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)複合タイプ値二つの複合タイプ(オブジェクト、配列、関数)のデータ比較では、それらの値が等しいかどうかを比較するのではなく、それらが同じアドレスを指すかを比較します.
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
上のコードはそれぞれ2つの空のオブジェクト、2つの空の配列、2つの空の関数を比較します.結果は同じではありません.複合タイプの値に対して厳密に等しい演算を比較したのは、同じメモリアドレスを参照しているかどうかであり、演算子の両側の空のオブジェクト、空の配列、空の関数の値は、それぞれ異なるメモリアドレスに保存されています.結果はもちろんfalseです.二つの変数が同じオブジェクトを参照すると、それらは同じです.
var v1 = {};
var v2 = v1;
v1 === v2 // true
なお、2つのオブジェクトの比較については、厳密に等しい演算子の比較はアドレスであり、演算子の比較より大きいか小さいかは値である.new Date() > new Date() // false
new Date() < new Date() // false
new Date() === new Date() // false
上の3つの表式は、前の2つの比較は値で、最後の比較は住所ですので、falseに戻ります.(4)undefinedとnull
undefinedとnullは自分自身の厳しさと同じです.
undefined==undefined//true null==null/trueは変数宣言後のデフォルト値がundefinedであるため、二つの宣言は未割り当て変数のみが等しいです.
var v1;
var v2;
v1 === v2 // true
(5)厳密に等しくない演算子厳密に等しい演算子には、対応する「厳密には等しくない演算子」があります.そのアルゴリズムは、厳密に等しい演算子の結果を求めて、逆の値を返します.
1 !== '1' // true
等分演算子等しい演算子が同じ種類のデータを比較するときは、厳密に等しい演算子と同じです.
異なるタイプのデータを比較する場合、等しい演算子はまずデータをタイプ変換し、厳密な等しい演算子で比較します.タイプ変換規則は以下の通りです.
(1)元のタイプの値
元のタイプのデータを数値に変換して比較します.
1 == true // true
// 1 === Number(true)
0 == false // true
// 0 === Number(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
'
123 \t' == 123 // true
// ,
上のコードは文字列とブール値を数値に変換して比較します.(2)オブジェクトと元のタイプの値の比較
オブジェクト(ここでは一般化のオブジェクトを指し、配列と関数を含む)が元のタイプの値と比較した場合、オブジェクトは元のタイプの値に変換され、比較されます.
[1] == 1 // true
// Number([1]) == 1
[1] == '1' // true
// Number([1]) == Number('1')
[1] == true // true
// Number([1]) == Number(true)
上のコードの中で、配列[1]は数値と比較し、先に数値に変換して比較します.文字列と比較すると、先に数値に変換して文字列と比較します.文字列も数値に変換されます.ブール値と比較すると、2つの演算子は先に数値に変換してから比較します.(3)undefinedとnull
undefinedとnullは他のタイプの値と比較した場合、結果はすべてfalseであり、それらが互いに比較した場合、結果はtrueである.
false == null // false
false == undefined // false
0 == null // false
0 == undefined // false
undefined == null // true
ほとんどの場合、オブジェクトはundefinedとnullと比較してfalseに戻ります.オブジェクトがundefinedに元の価値に変換された時だけtrueに戻ります.これは非常に珍しいことです.(4)等しい演算子の欠点
等数演算子の隠しタイプの変換は、直感に反する結果をもたらします.
0 == '' // true
0 == '0' // true
2 == true // false
2 == false // false
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r
' == 0 // true
これらの表式はエラーが発生しやすいので、等しい演算子(=)を使わないで、厳密な等しい演算子(===)だけを使用した方がいいです.(5)等しくない演算子
等数演算子には対応する「不等分演算子」があります.両者の演算結果は正反対です.
1 != '1' // false
if判断文ここのif(xxx)で条件文に対する判断は、非ブール値のパラメータを自動的にブール値に変換します.ここでは自動的にブール値に変換する場合をまとめます.
ブール値に自動変換
以下の5つの値を除いて、他は自動的にtrueになります.
if ( !undefined
&& !null
&& !0
&& !NaN
&& !''
) {
console.log('true');
} // true