今日は、学校の課題で変数が真か偽かをチェックする方法を考慮したコードについてのコメントを得ました。
私が書いたコードは次のようなものです。
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はその変数にあってはいけません。
まず、事実:
if (booleanValue)
if
の真の値、booleanValue
、ゼロ以外の数値、空でない文字列値、オブジェクトまたは配列参照などのtrue
ステートメントを満たします。
一方:
if (booleanValue === true)
これは、if
がbooleanValue
と正確に等しい場合にのみ、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;
}
...
あなたが書いた場合:if(x === true)
、それは唯一のx = trueのためにtrueになります
:if(x)
と書くと、xのいずれにも当てはまりません。 ''(空文字列)、false、null、undefined、0、 NaN.
プレーンな "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 {
....
}
それはあなたのユースケースによります。型をチェックするのも理にかなっているかもしれませんが、それが単なるフラグであるならば、そうではありません。
一般的に、=== true
を省略する方がわかりやすくて簡単です。
しかし、Javascriptでは、これらの記述は異なります。
booleanValue
がtruthy - 0
、false
、''
、NaN
、null
、およびundefined
以外の場合、if (booleanValue)
は実行されます。
if (booleanValue === true)
はbooleanValue
がtrue
と正確に等しい場合にのみ実行されます。
すでにboolとして明確に初期化されているので、===
演算子は必要ないと思います。
チェックされた値はブール値であるため、コーディングを少なくするために直接使用することをお勧めし、まったく同じです== true
Identity(===)演算子は、型変換が行われないことを除いて、equality(==)演算子と同じように動作します。型が等しいと見なすには、型が同じである必要があります。
if(booleanValue)は基本的にif(booleanValue == true)です。
あなたの推論は正しいと思います。しかし実際には、私は===
の比較を省略することがはるかに一般的であることを発見しました。これには3つの理由があると思います。
undefined
またはnull
の値が発生したときに噛み付く傾向があります。そのような場合にテストを失敗させたいだけのことがよくあります。 (私はこの見方と「失敗の速さ」のモットーのバランスを取ろうとしているが)。この例を考えてください。
var someString = getInput();
var normalized = someString && trim(someString);
// trim() removes leading and trailing whitespace
if (normalized) {
submitInput(normalized);
}
この種のコードは珍しいことではないと思います。 getInput()
がundefined
、null
、または空の文字列を返す場合を処理します。 2つのブール評価のため、submitInput()
は与えられた入力が非空白文字を含む文字列の場合にのみ呼び出されます。
JavaScriptでは、&&
は最初の引数が誤っている場合はその最初の引数を返し、最初の引数が真実である場合はその2番目の引数を返します。 normalized
が未定義の場合、undefined
はsomeString
になります。つまり、上記のブール式への入力はどれも実際にはブール値ではありません。
このようなコードを見ると、強い型チェックに慣れているプログラマーの多くが泣くことを私は知っています。しかし、強い型付けを適用するには、null
またはundefined
の値を明示的にチェックする必要があることに注意してください。 JavaScriptでは不要です。
Javascriptでは、ブール値の考え方はかなりあいまいです。このことを考慮:
var bool = 0
if(bool){..} //evaluates to false
if(//uninitialized var) //evaluates to false
したがって、if文(または他の制御文)を使用している場合は、「ブール型」のvar型を使用する必要はありません。したがって、私の意見では、あなたの文の "=== true"の部分は、それがブール値であることがわかっていれば不要ですが、値があいまいな "真実"のvarであれば絶対に必要です。 javscriptのブール値の詳細については、 こちら を参照してください。
これは違います。あなたの変数がTRUEになるものになってしまうかもしれないと心配しているなら。その後、ハードチェックは必須です。それ以外の場合はあなた次第です。しかし、whatever == TRUE
という構文が、自分のしていることを知っている人を混乱させることはないでしょう。
変数がブール値しか取り得ない場合は、短い構文を使用するのが妥当です。
他の型を代入する可能性があり、true
を1
または"foo"
と区別する必要がある場合は、=== true
を使用する必要があります。