4

以下の条件付き構文の主な違いは何ですか?

if (something) {
    // do something
}

対。

if (something == true) {
    // do something
}

違いはありますか?

編集:申し訳ありません。質問されたときにタイプミスをしました。等号を 3 つ入れるつもりはありませんでした。三重等号が厳密な演算子であることは知っています。「==」がif(何か)と同等かどうかを尋ねるつもりでした。

4

6 に答える 6

13

違いは、 inif(something)somethingboolean として評価されることです。基本的には

if(ToBoolean(something))

ここToBooleanで、引数をブール値に変換するために呼び出される内部関数です。ToBoolean二重否定でシミュレートできます: !!something

2 番目のケースでは、両方のオペランドが (最終的に) 最初に数値に変換されるため、最終的には次のようになります。

if(ToNumber(something) == ToNumber(true))

これは非常に異なる結果につながる可能性があります。繰り返しToNumberますが、内部関数です。単項プラス演算子:を使用して (ある程度) シミュレートできます+something == +true。実際のアルゴリズムでは、 がオブジェクトの場合somethingに最初に渡され ます。ToPrimitivesomething


と仮定する

var something = '0'; // or any other number (not 0) / numeric string != 1

if(something)は空でない文字列であるtrueため、になります。'0'

if(something == true)になりますfalseので、ToNumber('0')0ToNumber(true)1および0 == 1false

于 2012-08-07T19:42:14.837 に答える
12

===編集:以下は、演算子が使用された元の質問にのみ当てはまります。

最初のものは if ステートメントの本体を実行する ifsomethingが「真実」であるのに対し、2 番目のものは型と値が と等しい場合にのみそれを実行しますtrue

では、「真実」とは?それを理解するには、その反対が何であるかを知る必要があります: falsey. JavaScript のすべての値は、条件式に配置された場合、強制的にブール値になります。誤った値のリストは次のとおりです。

  • false
  • 0(ゼロ)
  • ""(空文字列)
  • null
  • undefined
  • NaN

他のすべての値は真実ですが、誰かがコメントで指摘するであろういくつかのあいまいなコーナーケースを見逃している可能性があります。

更新された質問に対する私の答えは次のとおりです。

条件付きif (something)if (something == true)は同等ですが、2 番目は冗長です。somethingどちらの場合も同じ方法で型強制されます。これは間違っています。Felix Kling's answerを参照してください。

于 2012-08-07T19:33:05.227 に答える
3

if(something)と同等if(someting == true)です。

==演算子は、同一性をチェックしながら、等しいかどうかを===チェックします。この場合、真の値は最初trueの条件の条件を満たしますが、2 番目の条件の条件のみを満たします。

編集:フェリックス・クリングの答えは正しいです。代わりに参照してください。

于 2012-08-07T19:35:17.093 に答える
2

質問が から===に変わったので==、いいえ、実質的な違いはありません。

于 2012-08-07T19:33:26.810 に答える
1

それを見るにはいくつかの方法があります。最初の例は、「何か」が真のような値または正の値を持つかどうかを評価します。したがって、0、負、null、または空でない限り、その if ステートメントの内容を評価する必要があります。

2番目のステートメントでは、「何か」がブール値のtrueに相当するかどうかをテストしています。別の単語「TRUE」または 1。「===」比較を実行して、比較対象と同一にすることもできます。したがって、この場合、何か === true を実行した場合、「何か」はブール値の true である必要があり、値 1 では不十分です。

于 2012-08-07T19:37:57.363 に答える
0

2 つの条件に違いはなくthing == true、単にthing.

thing === trueただし、と だけでは大きな違いがありthingます。

JavaScript では、値が条件に置かれると、値はブール値に強制されます。trueこれは、すべての型のすべての値を または のいずれかに強制できる必要があることを意味しますfalsetrue一般に、強制される値は「真実」と呼ばれ、強制される値falseは「偽」と呼ばれます。

「誤った」値は次のとおりです。

  • NaN(数字ではありません)
  • ''(空文字列)
  • undefined
  • null
  • 0(数値 0)

他のすべてはtrue、強制されたときに評価されます。この jsFiddleは、何が「真実」で何が「偽り」かを追跡するのに役立ちます。

同一性演算子 ( ===) は型強制を実行しません。型が異なる場合、比較はすぐに失敗します。

于 2012-08-07T19:42:21.403 に答える