171

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

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

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 はその変数に含めるべきではありません。

4

14 に答える 14

261

まず、事実:

if (booleanValue)

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

一方で:

if (booleanValue === true)

これは、が と正確に等しいif場合にのみ条件を満たします。それを満足させる真の値は他にありません。booleanValuetrue

一方、これを行う場合:

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 

value の場合、それは真の値である2と考えられる2ため、 と比較すると有利trueですが、それは型強制の仕組みではありません。右側の値を左側の値の型と一致するように変換trueしているため、数値に変換している1ため、比較し2 == 1ていますが、これは確かに意図したものではありません。

だから、バイヤーは注意してください。==比較する型を明示的に知っていて、すべての可能な型強制アルゴリズムがどのように機能するかを知っていない限り、ほとんどすべての場合で避けるのが最善です。


したがって、期待される値booleanValueと、コードをどのように機能させたいかによって異なります。trueorの値しか持たないことが事前にわかっている場合は、false明示的に

if (booleanValue === true)

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

if (booleanValue)

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

一方、何が原因かわからず、他の自動型変換が許可されていないbooleanValue状態で本当に に設定されているかどうかをテストしたい場合は、次のようにします。true

if (booleanValue === true)

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


たとえば、.on()jQuery での の実装を見ると、オプションの戻り値があります。コールバックが を返す場合、falsejQuery はイベントの伝播を自動的に停止します。この特定のケースでは、jQueryfalseは が返された場合にのみ伝播を停止したいので、戻り値を明示的にチェックします。これは、比較を満たすために false に自動的に型変換する必要=== falseがないためです。undefined0""

たとえば、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;
    }
    ...
于 2013-03-13T19:00:29.093 に答える
45

と書くif(x === true)と、 x = true だけで true になります

と書くと、 '' (空の文字列)、false、null、undefined、0、NaN以外のx に対してif(x)true になります。

于 2013-03-13T18:55:56.323 に答える
5

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

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

if (booleanValue)booleanValueが真実である場合に実行されます– 、、、、、、および。以外0falseもの。''NaNnullundefined

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

于 2013-03-13T18:53:30.327 に答える
5

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

于 2013-03-13T18:51:41.483 に答える
4

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

于 2013-03-13T18:54:40.083 に答える
3

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

于 2013-03-13T18:54:29.217 に答える
3

変数がブール値しかとれない場合は、短い構文を使用するのが合理的です。

他のタイプが割り当てられる可能性があり、またはとtrue区別する必要がある場合は、 を使用する必要があります。1"foo"=== true

于 2013-03-13T18:55:50.537 に答える
2

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

于 2013-03-13T18:53:22.300 に答える
2

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

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

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

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

于 2013-03-13T19:01:15.130 に答える
2

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

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

次の例を検討してください。

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

if (normalized) {
    submitInput(normalized);
}

このようなコードは珍しくないと思います。、、または空の文字列をgetInput()返すケースを処理します。2 つのブール値評価のため、指定された入力が空白以外の文字を含む文字列である場合にのみ呼び出されます。undefinednullsubmitInput()

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

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

于 2013-03-13T19:11:30.160 に答える
1

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

于 2013-03-13T18:54:40.917 に答える
1

Revisa https://www.w3schools.com/js/js_comparisons.asp

example:

var p=5;

p==5 ? true
p=="5" ?  true
p==="5" ? false

=== means same type also same value == just same value

ここに画像の説明を入力

于 2019-09-03T17:56:55.860 に答える