5

==オペレーターは本当に面白いです。通常、思ったように動作しません

これにより、氷山の先端の下で何が起こっているのかを正確に調査することになりました。MDNによると、次のようになります。

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

(ソース)

では、なぜ"undefined" == undefined真と評価されないのでしょうか。

この説明に従って、undefinedに変換してからtrueを返す必要はありませんか?"undefined"

4

5 に答える 5

20

"undefined"値があります。それは9文字です:未定義。したがって、文字列「undefined」には未定義の値はありませStringjavascriptのAは未定義の値を持つことができStringますが、ここではオブジェクトは「未定義」と綴るだけの定義済みの値を持っています。

あなたが提供した説明を使用するundefinedと、右側の値Stringは値が割り当てられていないオブジェクトに変換され、String「未定義」と比較され、比較に失敗します。

于 2012-05-21T20:06:16.920 に答える
2

この種の質問については、ソースであるECMAScript5.1仕様に戻る価値があります。セクション11.9.3には、double-equalsで何が起こるかについての完全な説明があります。

  1. Type(x)がType(y)と同じ場合、//いくつかのルール
  2. xがnullで、yが未定義の場合、trueを返します。
  3. xが未定義で、yがnullの場合、trueを返します。
  4. Type(x)がNumberで、Type(y)がStringの場合、比較の結果x == ToNumber(y)を返します。
  5. Type(x)がStringで、Type(y)がNumberの場合、比較の結果ToNumber(x)==yを返します。
  6. Type(x)がブール値の場合、比較ToNumber(x)==yの結果を返します。
  7. Type(y)がブール値の場合、比較の結果x == ToNumber(y)を返します。
  8. Type(x)がStringまたはNumberのいずれかであり、Type(y)がObjectの場合、比較の結果x == ToPrimitive(y)を返します。
  9. Type(x)がObjectで、Type(y)がStringまたはNumberの場合、比較ToPrimitive(x)==yの結果を返します。
  10. falseを返します。

この場合、Type(x)はstringであり、Type(y)はundefinedであるため、ルールは結果がfalseである必要があると述べています。

于 2012-05-21T20:29:31.013 に答える
0

"undefined"文字通りastringundefinedあり、objectです。nothingまたは""またはで右側のオペランドをキャストすると思いますan empty string。だから"undefined" == null戻りfalseます。

于 2012-05-21T20:18:36.963 に答える
0

undefined組み込み型のjavascriptのプリミティブ組み込み値ですUndefined。また、のような比較を行うことはx == undefined、javascriptでは特別な意味があります。変数がまだ定義されていないかどうかをチェックします。

于 2012-05-21T20:10:13.533 に答える
-2

undefinedは特別なjavascriptキーワードです。以下は、未定義の変数/プロパティをチェックする方法です。

var a = undefined;

//if( a == undefined ) 

//if( a === undefined )
于 2012-05-21T20:08:42.020 に答える