0

こんにちは仲間のJSジャンキー。変数の真偽を評価する次の方法の違いを誰かに説明してもらえますか?

var q1Var1 = "hello",
        q1Var2 = 0,
        q1Var3 = true,
        q1Var4 = "false",
        q1Var5 = -1,
        q1Var6 = undefined,
        q1Var7 = null,
        q1Var8;

// What is the difference between this block of code:

console.log( !q1Var1 );
console.log( !q1Var2 );
console.log( !q1Var3 );
console.log( !q1Var4 );
console.log( !q1Var5 );
console.log( !q1Var6 );
console.log( !q1Var7 );
console.log( !q1Var8 );

// and this block?

if( q1Var1 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var2 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var3 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var4 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var5 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var6 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var7 === true ){ console.log( "true" ) } else { console.log( "false" ) };
if( q1Var8 === true ){ console.log( "true" ) } else { console.log( "false" ) };

2番目のブロックが最初のブロックの逆になることを期待していました(つまり、値が切り替わるだけです)が、文字列以外の「true」に設定された変数のみが実際にtrueを返すように見えます。どうしてこれなの?2つの評価の根本的な違いは何ですか?

!q1Var1

vs.

true === q1Var1
4

4 に答える 4

7

これは、JavaScriptの「偽の」値の概念を示しています。たとえば、ブールコンテキスト(条件など)の場合undefinedと同じになります。しかし、それは真実ではありません。以下はすべて「偽の」値です。falseifundefined === false

  • false
  • undefined
  • 空の文字列
  • 数字0
  • null
  • NaN

===演算子は「厳密に等しい」を意味します(たとえば、ここを参照)。自動型変換を抑制します。

(上記の2番目のリンクからの)演算子の型変換規則==は次のとおりです。

2つのオペランドが同じタイプでない場合、JavaScriptはオペランドを変換してから、厳密な比較を適用します。いずれかのオペランドが数値またはブール値の場合、可能であれば、オペランドは数値に変換されます。それ以外の場合、いずれかのオペランドが文字の場合、可能であれば、もう一方のオペランドは文字列に変換されます。両方のオペランドがオブジェクトの場合、JavaScriptは、オペランドがメモリ内の同じオブジェクトを参照するときに等しい内部参照を比較します。

厳密な比較ルールは次のとおりです。

  • 2つの文字列は、対応する位置に同じ文字シーケンス、同じ長さ、同じ文字がある場合、厳密に等しくなります。
  • 2つの数値は、数値が等しい(数値が同じ)場合、厳密に等しくなります。NaNは、NaNを含め、何にも等しくありません。正と負のゼロは互いに等しい
  • 両方が真または両方が偽の場合、2つのブールオペランドは厳密に等しい
  • 厳密な比較でも抽象的な比較でも、2つのオブジェクトが等しくなることはありません
  • オブジェクトを比較する式は、オペランドが同じオブジェクトを参照している場合にのみ真になります
  • ヌルタイプと未定義タイプは==です(ただし===ではありません)

!var特に、これはと同じではないことに注意してくださいvar == false(そして、そもそもブール値ではないvar === false場合と同じではありません)。var空でない文字列は「真実」!"..."です(常にfalse空でない場合"...")が、数値に変換されたときに0と評価される空でない文字列(など"0")は== falseです。

于 2012-10-29T17:59:19.417 に答える
0

私が理解しているように、2番目のテストセット(q1Var1 === true)は、絶対的な同等性を探しています。完全に一致するものを探しているため、デフォルトでは真実になりません。

最初のセットで、私はこのビットについて少し曖昧ですが、テストにはコンテキストがないため、オブジェクトをテストしていると思います...少なくとも、それが起こっていると思います... oo

于 2012-10-29T18:09:52.727 に答える
0

演算子は===少し混乱する可能性があり、時々使いすぎです。演算子を使用するとき===は、タイプと値を比較することに注意することが重要です。したがって、このようなステートメントを使用すると、次のようになります。

if( q1Var1 === true ) 

q1Var1のタイプと値が同じである必要がありますtrue。状況が次のように設定されている場合:

q1Var1 = 1; 
if (q1Var1 === true) { console.log(true); } else { console.log(false); }//false

次に、はと同じタイプおよび値ではないfalseため、コンソールはログに記録します。1true

ただし、演​​算子を使用すると、はと同じ値であるため==、コンソールはログに記録します。true1true

これは次のように観察できます。

if (1 == true) { console.log(true); } else { console.log(false); }//true
if (1 && true) { console.log(true); } else { console.log(false); }//true

一方、

if( !q1Var1 ); 

q1Var1が0であるかどうかをテストします。特に、false値も0に等しいため(ただし、型はまだありません)、

if (0 && false) { console.log(true); } else { console.log(false); }//true (same value)
if (0 == false) { console.log(true); } else { console.log(false); }//true (same value)
if (0 === false) { console.log(true); } else { console.log(false); }//false (same value, different type)

タイプのテストがないため、このテストは数値とブール値で真になる可能性があります。

if (!0) { console.log(true); } else { console.log(false); }//true
if (!false) { console.log(true); } else { console.log(false); }//true
于 2012-10-29T18:05:10.320 に答える
0

演算の2つの異なるオペランドがある場合、最初の値の解釈(型変換)を行って、結果を2番目のオペランドの型で返す必要があります。これはと呼ばれtype castます。条件付き方程式ではboolean、結果は型である必要があるため、結果は常ににキャストされbooleanます。したがって、質問に戻ると、この例はすべて、castとは異なる型booleanです。javascriptではキャストは自動的に行われますが、一部の言語では、特にstrict構文を使用する場合は、自分でキャストを指定する必要があります。そうしないと、ログがエラーでいっぱいになります。

于 2012-10-29T18:08:15.003 に答える