ifステートメントのブール値


144

今日、学校の課題で変数がtrueかfalseかをチェックする方法を考慮して、コードについて意見を述べました。

私が書いたコードは次のようなものでした:

var booleanValue = true;

function someFunction(){
    if(booleanValue === true){
        return "something";
    }
}

彼らは、次のように書く方が良い/端正だと言った:

var booleanValue = true;

function someFunction(){
    if(booleanValue){
        return "something";
    }
}

「=== true」の部分について私が得た発言は、それが必要ではなく、混乱を引き起こす可能性があるということでした。

しかし、私の考えでは、特にJavascriptはルーズタイプの言語であるため、変数がブール値であるかどうかを確認する方が良いと考えています。

2番目の例では、文字列も「何か」を返します。

だから私の質問; 将来的に "=== true"の部分を失うのはきれいですか、それとも変数の型もチェックするのは良い習慣ですか?

編集: 私の「実際の」コードでは、ブール値は画像が削除されたかどうかを表しているため、boolValueが持つべき唯一の値はtrueまたはfalseです。

たとえば、0と1はその変数に含めないでください。


4
読みやすく、適切に使用する===
Piyas De

2
の+1 === true。混乱を避ける!!
ガスウ2013年

1
@gashu検討[0] === trueはfalse と評価されます。
RestingRobot 2013年

1
@Jlangeはいけませんか?説明してください
Gashu

つまり、「真実」の存在を確認したいだけの場合、そのステートメントはtrueと評価されるべきですが([0]はtrueと評価されますが、型変換なしでは評価されません)、失敗します。それは本当にあなたがあなたの声明で達成しようとしていることに依存します。=== true条件がと完全に等しいことを確認する必要がある場合に使用しますtrue
RestingRobot 2013年

回答:


222

まず、事実:

if (booleanValue)

ifbooleanValue含むという真実の値、trueゼロ以外の数値、空でない文字列値、オブジェクトまたは配列参照などについてステートメントを満たします...

一方:

if (booleanValue === true)

これはifbooleanValueがと完全に等しい場合にのみ条件を満たしtrueます。他の真実の値はそれを満たしません。

一方、これを行うと:

if (someVar == true)

次に、Javascriptが行うことは、型の型trueに一致するように型強制しsomeVar、2つの変数を比較することです。これがおそらく意図したものとは異なる状況がたくさんあります。このため、ほとんどの場合、==JavaScriptが型を強制的に入力する方法に関するかなり長い規則のセットが同じ型になるようにして、それらの規則をすべて理解し、JSインタープリターが実行する可能性があるすべてのことを予測できない場合は、回避する必要があります。 2つの異なるタイプ(ほとんどのJS開発者はできません)を考えると、おそらく==完全に避けたいでしょう。

混乱を招く例として:

var x;

x = 0;
console.log(x == true);   // false, as expected
console.log(x == false);  // true as expected

x = 1;
console.log(x == true);   // true, as expected
console.log(x == false);  // false as expected

x = 2;
console.log(x == true);   // false, ??
console.log(x == false);  // false 

値については、2それ2は真の値であると考えるので、と比較すると有利trueですが、型強制が機能する方法ではありません。これは、右側の値を左側の値のタイプに一致するように変換trueしている1ため、数値に変換して比較し2 == 1ているため、意図したとおりではありません。

したがって、バイヤーは注意してください。==比較する型を明確に把握し、可能なすべての型強制アルゴリズムがどのように機能するかを理解していない限り、ほとんどすべてのケースで回避するのが最善です。


そのため、実際に期待される値booleanValueと、コードの動作方法によって異なります。trueorのfalse値のみが存在することが事前にわかっている場合は、それを明示的に比較します

if (booleanValue === true)

余分なコードであり、不要であり、

if (booleanValue)

よりコンパクトで、間違いなくよりクリーンで優れています。

一方、何booleanValueが起きているのかわからずtrue、他の自動型変換を許可せずに本当に設定されているかどうかをテストしたい場合は、

if (booleanValue === true)

良いアイデアであるだけでなく、必須です。


たとえば.on()、jQueryのの実装を見ると、オプションの戻り値があります。コールバックがを返す場合、falsejQueryは自動的にイベントの伝播を停止します。場合はjQueryのONLY停止伝播したいので、この特定のケースでは、false返された、彼らは、戻り値の明示をチェックし=== false、彼らはしたくないので、undefinedまたは0または""または何か他のものも自動的にfalseにコンバートを入力します比較を満たします。

たとえば、jQueryイベント処理のコールバックコードは次のとおりです。

ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );

if ( ret !== undefined ) {
     event.result = ret;
     if ( ret === false ) {
         event.preventDefault();
         event.stopPropagation();
     }
 }

jQueryが明示的に探していることがわかりret === falseます。

しかし、jQueryコードには、コードの要望に応じて、より単純なチェックが適切な場所が他にもたくさんあります。例えば:

// The DOM ready check for Internet Explorer
function doScrollCheck() {
    if ( jQuery.isReady ) {
        return;
    }
    ...

私はしばらくの間この質問について考えていましたが、尋ねる人を見つける機会がありませんでした。ご覧いただければ幸いです。stackoverflow.com/questions/32615466/...
MMM

この答えは完全に正しくはありません。「x == true」は、ゼロ以外の数値ではtrueになりません。
Teemoh 2017年

@Teemoh-コメントが理解できません。jsfiddle.net/jfriend00/89h8d8tmを参照してください。
jfriend00 2017年

1
答えの最初の段落で書いたように、「if(x)」は「if(x == true)」と同じではないことを言いたいだけです。'if(x)'は明示的に 'x'をブール表現に変換します。'if(x == true)'はEcmaScript抽象比較アルゴリズムを使用します。'if(x == true)'は、ゼロ以外の数値または空でない文字列またはオブジェクトに対してtrueになると書いた。これは間違っています。1の代わりに2で例を実行すると、機能しません。
Teemoh 2017年

2
@Teemoh-私はあなたの意見を理解しています。回答を修正および明確化し、型強制に関するセクションを追加して、予期しないことをどのように実行できるかを示す例を追加しました。
jfriend00 2017年

40

次のように記述した場合if(x === true)、x = trueの場合のみtrueになります

次のように記述した場合if(x)、それは、x(空の文字列)、false、null、未定義、0、NaNではないすべてのxに対して trueになります。


(空の文字列)、false、null、未定義、0、NaN
Oliboy50

とを忘れないNaN-0
haykam

8

プレーンな「if」では、変数はブール値に強制変換され、オブジェクトでtoBooleanを使用します:-

    Argument Type   Result

    Undefined       false
    Null            false
    Boolean         The result equals the input argument (no conversion).
    Number          The result is false if the argument is +0, 0, or NaN;
                    otherwise the result is true.
    String          The result is false if the argument is the empty 
                    String (its length is zero); otherwise the result is true.
    Object          true.

ただし、===との比較には型強制はありません。そのため、強制せずに等しい必要があります。

オブジェクトがブール値でさえないかもしれないと言っているなら、あなたは単に真/偽以上のものを考慮する必要があるかもしれません。

if(x===true){
...
} else if(x===false){
....
} else {
....
}

5

ユースケースによって異なります。タイプもチェックするのは理にかなっているかもしれませんが、それが単なるフラグの場合はそうではありません。


===比較は、型変換を実行しません。したがって、OPのコードはフラグのタイプを効果的にテストします。値がブール値でtrueの場合にのみ成功します。
ジェシーハレット2013年

言い換えましょう。あなたがそれが真か偽のどちらかであることがわかっているなら、それは問題ではありません。
Ven

5

一般に、を省略する方がよりクリーンで簡単=== trueです。

ただし、JavaScriptでは、これらのステートメントは異なります。

if (booleanValue)場合に実行されますbooleanValueですtruthy以外のものを- 、0false''NaNnullundefined

if (booleanValue === true)booleanValueがに正確に等しい場合にのみ実行されtrueます。


これは、boolValueのみをtrueまたはfalseにしたい場合でも、正確に確認したいものです。変数は、コードで複数回true / falseに設定されます。私はコードを書くときにそれを知っていますが、1年後にもう一度コードをチェックすると、すべてを正しく読み直さない限り、それは大きな疑問符になりますか?
DirkZz 2013年

@aldanux:おっと; という意味''です。
SLaks

4

識別(===)演算子は(==)、型変換が行われず、型が等しいと見なされるためには型が同じでなければならないことを除いて、等値演算子と同じように動作します。


あなたの最後の文は間違っています。あなたの二つの文を試してみてくださいif (booleanValue)if (booleanValue==true)するときbooleanValueです2。これらの2つのステートメントでは、同じ結果は得られません。
jfriend00

面白い。私はそれをあなたの言葉にします。私はObjC / C / C ++の世界で考えていましたが、JSでは正しいと思います。JSのデータ型は変更可能で、2 == trueはその場合の数量化になりません。
Apollo SOFTWARE

1
この特定の例については、上記の私の回答を参照してください。異なる型の2つの値を比較するために、Javascriptが自動型変換を行う方法と関係があります。
jfriend00

3

チェックされた値はBooleanコーディングを減らすために直接使用することをお勧めしますが、まったく同じでした==true


2

既にboolとして明確に初期化されているので、===演算子は必要ないと思います。


2

変数がブール値のみを取ることができる場合は、短い構文を使用するのが妥当です。

それは潜在的に、他のタイプを割り当てることができ、あなたは区別する必要がある場合trueから1"foo"、あなたが使用する必要があります=== true


2

あなたの推論は正しいと思います。しかし実際には、===比較を省略することがはるかに一般的であることがわかりました。その理由は3つあると思います。

  1. それは通常、式の意味を追加しません-とにかく値がブール値であることがわかっている場合です。
  2. JavaScriptには型の不確実性が非常に多いため、予期しundefinedないnull値や値を受け取ったときに型チェックを強制すると、噛み付く傾向があります。多くの場合、そのような場合にテストを失敗させたいだけです。(私はこの見解と「失敗する」というモットーのバランスをとろうとしていますが)。
  3. JavaScriptプログラマーは、特にブール式では、型を使って素早い遊びをするのが好きです。

この例を考えてみましょう:

var someString = getInput();
var normalized = someString && trim(someString);  
// trim() removes leading and trailing whitespace

if (normalized) {
    submitInput(normalized);
}

この種のコードは珍しいことではないと思います。それはケースハンドルgetInput()を返すundefinednullまたは空の文字列を。2つのブール値があるためsubmitInput()、指定された入力が非空白文字を含む文字列である場合にのみ呼び出されます。

JavaScript &&では、偽の場合は最初の引数を返し、最初の引数が真の場合は2番目の引数を返します。そうnormalizedなりますundefined場合someStringなどは未定義とされました。つまり、上記のブール式への入力は、実際にはブール値ではありません。

このようなコードを見ると、強力な型チェックの問題に慣れている多くのプログラマーがいることを知っています。ただし、厳密な型指定を適用するには、明示的なチェックnullまたはundefined値が必要になる可能性が高く、コードが煩雑になります。JavaScriptでは不要です。


1

これによります。変数がTRUEに解決されるものになる可能性があると心配している場合。その場合、ハードチェックは必須です。そうでなければそれはあなた次第です。ただし、構文whatever == TRUEが、自分が何をしているのかを知っている人を混乱させることはないと思います。


1

Javascriptでは、ブール値の概念はかなりあいまいです。このことを考慮:

 var bool = 0 
 if(bool){..} //evaluates to false

 if(//uninitialized var) //evaluates to false

したがって、ifステートメント(またはその他の制御ステートメント)を使用している場合、「ブール」タイプの変数を使用する必要はありません。したがって、私の意見では、ステートメントの「=== true」の部分は、それがブール値であることがわかっている場合は不要ですが、値があいまいな「真正な」変数の場合は絶対に必要です。javscriptのブール値について詳しくは、こちらをご覧ください



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.