値(null
、undefined
、false
、''
、0
)if
ステートメントでは、常にfallacy(false
)として評価されます。また、これらの値の否定((null
、undefined
、false
、''
、0
)if
ステートメントでは、常にトートロジー(true
)として評価されます。
if(null){
}else{
}
if(undefined){
}else{
}
if(false){
}else{
}
if(''){
}else{
}
if(0){
}else{
}
上記のすべての場合、if
ステートメントは、false
&else
ステートメントの実行時に評価されます。ただし、これらの誤りの値と==
演算子、常にtrue
を返すわけではありません。驚いたことに、これらの値の否定を比較しているときは、常にtrue
値を返しています。
double equalto(==
)演算子は値をチェック/比較し、厳密に型ではなく、その理由:
null == false // returns false
null == 0 // returns false
null == '' // returns false
だが、
!null == !false // returns true
!null == !0 // returns true
!false == !undefined // returns true
そして、
null == undefined // returns true
false == 0 // returns true
これらの値(null
、undefined
、false
、''
、0
)。
"... double equalto(
==
)演算子は値のチェック/比較のみを行い、型のチェックは行いません..."
それは間違った仮定ですが、人々によってしばしば繰り返されます。実際には、==
doesチェックタイプであり、実際には===
比較よりもタイプにはるかに注意を払っています。
抽象的な等価比較アルゴリズムを参照してください。
==
比較は、単純なtoBoolean変換を行いません。むしろ、やや複雑な再帰アルゴリズムを使用して、型をチェックした後、一致しない場合は同じ型にオペランドを強制しようとします。
実行する型強制は、オペランドの型に非常に固有です。異なるタイプのペアに対して、異なる一連の強制が発生する可能性があります。通常(常にではありません)、最終的にオペランドをnumber
型に強制的に変換します。
!
ingすることが物事を変える理由!
を使用して両方のオペランドを手動で強制する場合、タイプを一致させる単純なtoBoolean変換を実行するようになりました。本質的に厳密な等価比較アルゴリズムのように動作させるアルゴリズムの強制部分。
したがって、型が一致しないときに==
比較の結果を予測する唯一の方法は、その抽象アルゴリズムを理解することです。
NaN
を忘れないでくださいまた、考慮すべきもう1つの「falsey」値、NaN
があります。その==
比較は、何があっても常にfalse
になります。別のNaN
値と比較する場合でも、false
になります。
undefined
:変数が宣言されたが、値が割り当てられていないことを意味します
null
:nullの値が割り当てられています。つまり、値がありません
false
、''
および0
おそらくこれらの意味を理解できると思います。
NULLはfalseとは異なり(NULLはオブジェクト型で、falseはブール型です)、nullは0とは異なります(0は整数型です)、nullは ''( ''は文字列型です)とは異なります。しかし、それらはすべて偽の値です。 !演算子はブール値を否定します。もし!偽の値に使用され、偽の値をブール型のオブジェクトに変換します。