1

わかりました、私は非常に多くのページにアクセスしており、上記の方法をすべて使用して、等しくないことを見つけました。しかし、現在、私の興味がピークに達しており、しばらくの間そうであったと思います。次の例の違いは何ですか?また、さまざまなシナリオで 1 つのバリエーションのみが他のバリエーションよりも機能する場合があるのはなぜですか?確かな答えを見つけようとしていますが、検索はそれほど簡単ではないと思います.

とにかく、多くの場合、他に何も機能しないように思われるため、次のようなことをしなければなりませんでした。

if(str == bad_condition)
{
  //ignore
}
else
{
   //code to do something
}

他の多くの場合、次のいずれかを行っています

if(!str == bad_condition)
{
   //code to do something
}

また

if(str != bad_condition)
{
   //code to do something
}

また

if(str !== bad_condition)
{
   //code to do something
}

ここで究極の質問だと思いますが、最後の 3 つのうちのどれかが特定のものに対してのみ機能するように見えるのはなぜですか? どちらか一方を優先するべき時間と場所はありますか? それとも、私は通常、他の誰かのオリジナルのコードベースに対処しなければならないので、私の抽選のランダムな運です。私は全体的に好奇心が強いだけであり、議論を引き起こしようとしているわけではありません. 上記のいずれかの使用に大きな違いがあるかどうか、そして何が、なぜ、またはどのようにあるのかを真剣に知りたい.

4

7 に答える 7

3

これらの最後の3つは互いに同じではなく、ほぼ確実に最初の3つを使用したくないでしょう。それらを分解しましょう:


if(!str == bad_condition)
{
   //code to do something
}

そうしないでください。そこで何が起こるかが最初に!str評価され、次にその結果がと比較されbad_conditionます。の結果はまたはの!strいずれtrueかになりますfalse。( is 、、、、、または;以外のtrue場合strはそうなります。)したがって、isまたは、でない限り、それと比較""する0必要はありません。isまたはの場合、通常、式を記述するためのより良い方法があります。nullundefinedNaNfalsebad_conditiontruefalse!strbad_condition truefalse


if(str != bad_condition)
{
   //code to do something
}

これは、 「緩い」等式strbad_condition使用する場合と比較されます。ゆるい平等はトリッキーであり、そのためのルールは複雑です。は、たとえば、そのままで; です。両方が同じタイプであることを知っている場合問題ありませんが、そうでない場合は、型強制的なものになります。"0" == 0true"" == 0"0" == false"false" == falsefalsestrbad_condition


if(str !== bad_condition)
{
   //code to do something
}

これは、厳密な等式strbad_condition使用する場合と比較されます。つまり、型強制は行われず、とが同じ型でない場合、条件は常に。になります。strbad_conditionfalse

于 2012-12-13T10:10:36.247 に答える
2

!=一緒に==行くと、データ型を気にせずに等しいかどうかをチェックするだけなので、次のことが起こります。

console.log([] == ""); //true

これは、空の文字列と同じように、の文字列値[]false ( ) と評価されるためです。[].toString()(Alnitak がコメントでこれを指摘してくれてありがとう!)

反対側!=====は、2 つの値が同一であることを一緒にチェックするため、前の例は false と評価されます。「偽物」についてはこちらをご覧ください。

console.log([] === ""); //false

!value変数を否定するだけなので、boolean true偽と評価される式を作成し、その逆になります。

于 2012-12-13T10:08:42.080 に答える
1

1つ目はわかりやすいと思います。str == true は、str が true に等しいかどうかを単純にチェックする条件です。この場合、true は文字列でもかまいません。2つ目は否定です。つまり、たとえば次のようになります。

    var str = true;
    if (str == true) <---- true, cause true == true;
    if (!str == true) <---- false because !str is false and false == true is false;

3 番目は、等しくないことを意味します。つまり、次のことを意味します。

    var str = true;
    if (str != true) <- gives us false because true not equal true is false because it actually is equal.

最後は3枚目とほぼ同じ。値と変数の型を比較す​​る場合は、=== または !== を使用します。これは、あなたが持っている場合を意味します

    var str = false;
    if (str === false) <- true, same value and same type (boolean).

しかし:

    var str = "false";
    if (str === false) <- false

同じ値ですが、変数には条件によって要求されたブール値ではなく文字列が含まれているためです。条件が次のようになる場合:

    if (str === "false") it would be true again 

同じ値 + 同じ型だからです。

それが役に立てば幸い

于 2012-12-13T10:26:19.630 に答える
0

上記の回答に加えて、「undefined」、「null」、および false について、またこれらが比較で「一見一貫性のない」結果をもたらす方法についても知る必要があります。

この記事は興味深いようです: http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN

于 2012-12-13T10:11:40.770 に答える
0

if(str == bad_condition)

この条件は、str が bad_condition と等しいかどうかをチェックします。等価性はチェックしません。つまり、変数の型は考慮されません。1 は「1」と同じと見なされ、true を返します。

if(!str == bad_condition)

これは単に前の if ステートメントの否定であり、str が bad_condition と等しくないかどうかを確認します。次のように書くこともできます。if(str != bad_condition)

if(str !== bad_condition)

この条件は等価性をチェックしています。つまり、型と値を比較し、式も否定されます。したがって、次のことが当てはまります。

str = 1, bad_condition = 2否定のため真を返す

str = 1, bad_condition = "1"true を返します。値は同じですが、型が異なります

str = 1, bad_condition = 1型と値の両方が同じであるため、false を返します。

于 2012-12-13T10:12:51.860 に答える
0

!=との違い!==は型チェックです。例えば ​​:

true != 0; // true
false != null; // false
false !== null; // true
false != 0; //false
false !== 0; // true

でも!str == bad_condition変です。私はあなたが言いたいと思います!(str == bad_condition)。しかし!str、有効な値です。!"test"falseあり、!""真です。

于 2012-12-13T10:09:02.587 に答える
0

あなたはここで毎回根本的に異なることをしています!


str == bad_condition

これは両方のオペランドを比較しますが、型強制を行います。そのため、一方のオペランドが数値または文字列の場合、もう一方が変換される可能性があり、混乱を招く結果になる可能性があります。


!str == bad_condition

ここでは、手動で型変換を行っています。演算子は、!いくつかの規則に従ってオペランドからブール値を作成します。


str != bad_condition

これは不等式をチェックしますが、 と同じ強制規則を使用し==ます。


str !== bad_condition

ここでは、最初に両方のオペランドの型を確認します (型強制は発生しません!)。両方が同じタイプの場合、その内容がチェックされます。


ご覧のとおり、あらゆる場合に異なるものを比較します。特定のニーズに応じて、使用することをお勧めします。===これら!==は型強制のない最も簡単な比較です。

JavaScript はコンテンツではなくオブジェクト参照によってオブジェクトを比較することに注意してください。したがって[] === []、同じ参照を共有しないオブジェクトを作成するため、false を生成します。

型強制のヒントとして、 MDNからこれを取得します。

等しい (==)

2 つのオペランドが同じ型でない場合、JavaScript はオペランドを変換してから、厳密な比較を適用します。いずれかのオペランドが数値またはブール値の場合、可能であればオペランドは数値に変換されます。そうでなければ、どちらかのオペランドが文字列の場合、可能であればもう一方のオペランドが文字列に変換されます。両方のオペランドがオブジェクトの場合、JavaScript は、オペランドがメモリ内の同じオブジェクトを参照する場合に等しい内部参照を比較します。

于 2012-12-13T10:13:13.123 に答える