web-dev-qa-db-ja.com

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

今日は、学校の課題で変数が真か偽かをチェックする方法を考慮したコードについてのコメントを得ました。

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

var booleanValue = true;

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

彼らはそれをこのように書くのがより良い/より良いと言いました:

var booleanValue = true;

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

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

しかし、私の考えでは、特にJavascriptはルーズタイプ言語であるため、変数がブール値かどうかをチェックすることをお勧めします。

2番目の例では、文字列も "something"を返します。

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

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

例えば0と1はその変数にあってはいけません。

113
DirkZz

まず、事実:

if (booleanValue)

ifの真の値、booleanValue、ゼロ以外の数値、空でない文字列値、オブジェクトまたは配列参照などのtrueステートメントを満たします。

一方:

if (booleanValue === true)

これは、ifbooleanValueと正確に等しい場合にのみ、true条件を満たします。他の真理値はそれを満足させません。

一方、これを行う場合:

if (someVar == true)

次に、Javascriptが行うことは、trueの型と一致するようにsomeVarと入力してから、2つの変数を比較することです。これが意図したものではない可能性が高い状況がたくさんあります。このため、ほとんどの場合、==を避ける必要があります。これは、Javascriptが2つのものを同じタイプに変換する方法に関するかなり長いルールセットがあり、これらすべてのルールを理解して、 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の期待値とコードの動作方法に依存します。 trueまたはfalseの値のみを取得することが事前にわかっている場合は、それと明示的に比較します

if (booleanValue === true)

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

if (booleanValue)

よりコンパクトで、間違いなくクリーナー/ベターです。

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

if (booleanValue === true)

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


たとえば、jQueryの.on()の実装を見ると、オプションの戻り値があります。コールバックがfalseを返す場合、jQueryはイベントの伝播を自動的に停止します。この特定のケースでは、jQueryはfalseが返された場合にのみ伝播を停止するため、undefinedまたは=== falseが必要ないため、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;
    }
    ...
185
jfriend00

あなたが書いた場合:if(x === true)、それは唯一のx = trueのためにtrueになります

if(x)と書くと、xのいずれにも当てはまりません。 ''(空文字列)、false、null、undefined、0、 NaN.

34
karaxuna

プレーンな "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.

しかし、===との比較では型強制は行われないため、型強制なしでは等しくなる必要があります。

オブジェクトがブール値ではない可能性があると言っているのなら、単なるtrue/false以上のものを考慮する必要があるかもしれません。

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

それはあなたのユースケースによります。型をチェックするのも理にかなっているかもしれませんが、それが単なるフラグであるならば、そうではありません。

5
Ven

一般的に、=== trueを省略する方がわかりやすくて簡単です。

しかし、Javascriptでは、これらの記述は異なります。

booleanValuetruthy - 0false''NaNnull、およびundefined以外の場合、if (booleanValue)は実行されます。

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

4
SLaks

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

2
Sunny

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

2
Alyafey

Identity(===)演算子は、型変換が行われないことを除いて、equality(==)演算子と同じように動作します。型が等しいと見なすには、型が同じである必要があります。

if(booleanValue)は基本的にif(booleanValue == true)です。

2
Apollo SOFTWARE

あなたの推論は正しいと思います。しかし実際には、私は===の比較を省略することがはるかに一般的であることを発見しました。これには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が未定義の場合、undefinedsomeStringになります。つまり、上記のブール式への入力はどれも実際にはブール値ではありません。

このようなコードを見ると、強い型チェックに慣れているプログラマーの多くが泣くことを私は知っています。しかし、強い型付けを適用するには、nullまたはundefinedの値を明示的にチェックする必要があることに注意してください。 JavaScriptでは不要です。

1
Jesse Hallett

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

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

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

したがって、if文(または他の制御文)を使用している場合は、「ブール型」のvar型を使用する必要はありません。したがって、私の意見では、あなたの文の "=== true"の部分は、それがブール値であることがわかっていれば不要ですが、値があいまいな "真実"のvarであれば絶対に必要です。 javscriptのブール値の詳細については、 こちら を参照してください。

1
Jlange

これは違います。あなたの変数がTRUEになるものになってしまうかもしれないと心配しているなら。その後、ハードチェックは必須です。それ以外の場合はあなた次第です。しかし、whatever == TRUEという構文が、自分のしていることを知っている人を混乱させることはないでしょう。

1
usumoio

変数がブール値しか取り得ない場合は、短い構文を使用するのが妥当です。

他の型を代入する可能性があり、true1または"foo"と区別する必要がある場合は、=== trueを使用する必要があります。

1
Barmar