web-dev-qa-db-ja.com

Javascriptの偽の値(null、undefined、false、空の文字列: ""または '' and 0)およびcomparison(==)演算子

値(nullundefinedfalse''0ifステートメントでは、常にfallacy(false)として評価されます。また、これらの値の否定((nullundefinedfalse''0ifステートメントでは、常にトートロジー(true)として評価されます。

 if(null){
 }else{
 }

 if(undefined){
 }else{
 }

 if(false){
 }else{
 }

 if(''){
 }else{
 }

 if(0){
 }else{
 }

上記のすべての場合、ifステートメントは、falseelseステートメントの実行時に評価されます。ただし、これらの誤りの値と==演算子、常に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

これらの値(nullundefinedfalse''0)。

19
Suraj Kumar

よくある誤解

"... double equalto(==)演算子は値のチェック/比較のみを行い、型のチェックは行いません..."

それは間違った仮定ですが、人々によってしばしば繰り返されます。実際には、==doesチェックタイプであり、実際には===比較よりもタイプにはるかに注意を払っています。

抽象的な等価比較アルゴリズムを参照してください。

==比較は、単純なtoBoolean変換を行いません。むしろ、やや複雑な再帰アルゴリズムを使用して、型をチェックした後、一致しない場合は同じ型にオペランドを強制しようとします。

実行する型強制は、オペランドの型に非常に固有です。異なるタイプのペアに対して、異なる一連の強制が発生する可能性があります。通常(常にではありません)、最終的にオペランドをnumber型に強制的に変換します。


オペランドを!ingすることが物事を変える理由

!を使用して両方のオペランドを手動で強制する場合、タイプを一致させる単純なtoBoolean変換を実行するようになりました。本質的に厳密な等価比較アルゴリズムのように動作させるアルゴリズムの強制部分。

したがって、型が一致しないときに==比較の結果を予測する唯一の方法は、その抽象アルゴリズムを理解することです。


NaNを忘れないでください

また、考慮すべきもう1つの「falsey」値、NaNがあります。その==比較は、何があっても常にfalseになります。別のNaN値と比較する場合でも、falseになります。

15
cookie monster

undefined:変数が宣言されたが、値が割り当てられていないことを意味します

null:nullの値が割り当てられています。つまり、値がありません

false''および0おそらくこれらの意味を理解できると思います。

1
Todd Motto

NULLはfalseとは異なり(NULLはオブジェクト型で、falseはブール型です)、nullは0とは異なります(0は整数型です)、nullは ''( ''は文字列型です)とは異なります。しかし、それらはすべて偽の値です。 !演算子はブール値を否定します。もし!偽の値に使用され、偽の値をブール型のオブジェクトに変換します。

1
Allan Chua