1

この質問のフォローアップとして:JavaScriptの条件文で「if(myBoolean == true)」と書く理由はありますか?-

JavaScriptでif(myBoolean === true)を使用するのが良い習慣であるのはなぜですか?比較的経験の浅いJavaScriptユーザーとして、私は、ブール値がtrueまたは「真の」値になる可能性のある特定の実際のシナリオで最終的にどのようなシナリオになるかを調べようとしています。 if(myBoolean)ではなく(myBoolean === true)かどうかを確認する

4

5 に答える 5

4

私は質問の前提に挑戦します:それは良い習慣ではないと思いますし、それがそうであるという一般的なコンセンサスもないと思います。:-)

使用する唯一の理由は、=== trueそれが実際にブール値であるかどうかわからず、そうでない場合myBooleanは結果をfalseにしたかった場合です。そのユースケースはありますが、かなり制限されています。、、およびその他の真if (myBoolean)の値に当てはまる場合でも、99.9%の確率で、単に十分です。1"foo"

オペランドが異なるタイプの場合の緩い等式に関するJavaScriptの規則は非常に複雑であるため、他の理由で厳密な等式を使用することは非常に良い考えである場合があります。しかし、何かをフラグとして使用している場合、それを使用する意味はほとんどありません===


ブール値で使用されているのを見た特定の場所の1つ===は、jQueryに触発されたコードです。ここでは、コールバック関数がを返すことでアクションをキャンセルできますが、何も返す必要falseはありません。関数に明示的な戻り値がない場合、その関数を呼び出した結果は、もちろんfalseになります。したがって、関数が返されるかどうかを確認したいコードは、だけでなく、次のようになります。undefinedfalseundefined

if (callback(args) === false) {
    // The callback explicitly returned false (not just a falsey value), cancel
    // ...
}

しかし、これは比較的まれなユースケースであり、もちろん、それとは=== false対照的に=== true...

于 2012-11-06T12:06:59.893 に答える
0

いくつかのランダムな例:

function CreateSomeObject(param)
{
   if (param == "1")
   {
      return new Stuff();
   }

   return null;
}

var myBoolean = CreateSomeObject("1") || true;

if (myBoolean === true)
{
  //doesn't execute
}

if (myBoolean)
{
   //executes just fine
}
于 2012-11-06T12:11:57.133 に答える
0

nullのみの場合は、これを実行しますが、より冗長で長い文字列のように感じるため、これを使用したことはありません。それを使用したり回避したりするのに問題はありません。それはあなたがコードを書きたいスタイルです。

于 2012-11-06T12:21:00.847 に答える
0

私は少し複雑な答えを作成しましたが、主な理由は真実の値ではなく、偽の値にあることに気づきました。通常、関数は1種類のものを返し、偽の値は1つだけです(文字列関数の場合は空の文字列、数値関数の場合は0など)。

ただし、何かが定義されているかどうかわからない場合は、参考になる可能性があります。

waitForResponse(request, 5000);
if(!request.ResponseValue) {
    alert('Server failed to respond');
}

vs

waitForResponse(request, 5000);
if(request.ResponseValue === 'false') {
    alert('Server says no');
}

私はあなたがブーリーネスではなく未定義をチェックするべきだと主張しますが:

if(typeof request.ResponseValue === 'undefined') {
   //...
}

ちなみに、typeof高速ですが、少なくとも前回チェックしたときはChromeでした。

于 2012-11-06T12:25:47.240 に答える
0

個人的には、 xを使用するのが良い習慣であるようなステートメントは好きではありません。IMO、それはすべてコンテキストに依存します。オブジェクトが存在することを確認したい場合は、またはとif(objectX)同じように実行します。if (objectX === undefined)if (typeof objectX === 'undefined')if (typeof objectX == 'undefined')

Douglas Crockfordのように、値と型のチェック(===)の使用を強く推奨する理由は、まれに、偽の値と真の値が予期しない結果をもたらす可能性があるためです。

var falsy = '';
if (falsy)
{//only when falsy is truthy, but an empty string is falsy
    console.log('could be seen as counter-intuitive: var was declared and assigned an empty string, but is falsy');
}
var obj = {falsy:''}
if (!obj.falsy)
{
   console.log('I might assume falsy is not set, although it was:');
   console.log(obj.hasOwnProperty('falsy'));//true
}

繰り返しますが、これは私の意見かもしれませんが、ほとんどの場合、これによってコードが破損することはありません。さらに一歩進んで、ダグラス・クロックフォードは、偽の値のチェックを使用するのは良い考えではないと主張するかもしれませんが、論理OR(||)演算子は好きです。

var falsy ='';
var someVar = falsy || 'default value';//this relies heavily on falsy values

厳密に比較するための唯一の「堅実な」議論は次のとおりです。

  • 変数をブール値にする必要があるが、再びブール値にfalsy = !!falsy;強制する場合
  • 厳密な比較はわずかに高速ですが、違いに気付く前に多くの比較を行う必要があります

そうは言っても、私は厳密な比較を非常に多く使用する傾向があります。これも個人的なことかもしれませんが、変数の実際のタイプが何であるかを知りたいです。少なくとも、変数を必要なタイプに強制変換することができます。
'1' == 1'1' === 1

var foo = '00001';
var elements = [foo = ('00000' + (+(foo)+1)).substr(-5)];
while(elements[+(foo)-1])
{
    foo = ('00000' + (+(foo)+1)).substr(-5);
    elements.push(foo = ('00000' + (+(foo)+1)).substr(-5));
}

さて、これはあなたが良いコードと呼ぶものではありませんが、多くの型ジャグリングが起こっています。ライドの最後に、に割り当てられた値を知りたい場合がありますfoo。これはこのスニペットの問題ではありませんが、奇数の場合は、whileループ内でfooの数値を使用するとします。

var foo = '00001';
var elements = [foo = ('00000' + (+(foo)+1)).substr(-5)];
while(elements[+(foo)-1])
{
    foo = ('00000' + (+(foo)+1)).substr(-5);
    elements.push(foo = ('00000' + (+(foo)+1)).substr(-5));
    if (+(foo)%2 === 1)
    {
        foo = +(foo);
        //do stuff with foo
    }
}

天気をチェックする最も簡単な方法fooは、ループが完了した後の文字列ですfoo。直接チェックするif (foo === +(foo))
ことです。この例は少し遠慮がちですが、これと非常によく似たケースに遭遇しました。強い型の言語の利点が実際に示されるのは、このようなときです。それについて言えば:new Date() >= someDateObjectvs Date() >= someDateObject...コンソールで試してみると、すぐに私が何をしているのかがわかります。

于 2012-11-06T12:48:22.163 に答える