17

JavaScript での null と未定義の違いは何ですか?によると、、nullおよびundefinedJavascript の 2 つの異なるオブジェクト (異なる型を持つ) です。しかし、このコードを試すと

var a=null;
var b;
alert(a==null);      // expecting true
alert(a==undefined); // expecting false
alert(b==null);      // expecting false
alert(b==undefined); // expecting true

上記のコードの出力は次のとおりです。

true
true
true 
true

==値のみが一致するようになったので、undefinedとの両方nullが同じ値である必要があると考えました。だから私は試しました:

alert(null)->与えるnull

alert(undefined)->与えるundefined

これがどのように可能かわかりません。

これがデモです。

編集

===と は型が異なるため、期待される結果が得られることはundefined理解してnullいますが、 の場合、Javascript で型変換はどのように機能し==ますか? Java のように明示的な型変換を行うことはできますか? と に手動の型変換を適用したいと思いundefinedますnull

4

7 に答える 7

19

等値演算子ではなく、恒等演算子=====を使用する必要があります。この変更により、コードは期待どおりに機能します。

alert(a===null);      // true
alert(a===undefined); // false
alert(b===null);      // false
alert(b===undefined); // true

この場合、等値演算子が失敗する理由は、型変換を試みるためです。undefinedタイプundefinedでありnull、タイプobjectです。2つを比較しようとすると、Javascriptは両方をfalseに変換します。これが、最終的にそれらが等しいと見なされる理由です。一方、同一性演算子は型変換を行わず、等しいと結論付けるには型が等しい必要があります。

編集 指摘してくれた @ user1600680 のおかげで、上記はまったく正しくありません。ECMAScript 仕様では、null から undefined を特殊なケースとして定義し、同等にします。への中間変換はありませんfalse


型変換のより簡単な例は、数値から文字列への変換です。

console.log(5 == "5");    // true
console.log(5 === "5");   // false

上記の回答には、Douglas Crockford のJavascript: The Good Partsからの適切な引用があります。

["==" 演算子が行う] オペランドが同じ型の場合は正しいことですが、異なる型の場合は値を強制しようとします。彼らがそれを行うためのルールは複雑で記憶に残るものではありません。

ルールが複雑で記憶に残らないと思わない場合は、それらのルール をざっと見てみると、その概念の乱用が解消されます。

于 2012-08-31T15:34:17.003 に答える
5

undefinednull 意味が大きく異なります。

undefined通常、「返信がなかった」nullという意味で、「返信があり、その返信は何もなかった」という意味です。

たとえば、このオブジェクトを作成した場合:

var gameState = {
  state: loaded,
  lastPlayer: null,
  lastScore: null
};

これは「最後のプレイヤーが誰なのかわからない」という意味ではなく、「最後のプレイヤーがいなかった」という意味です。

于 2012-08-31T16:03:22.413 に答える
2

undefinedまた、は とともに使用されるとも言いたいですtypeof。比較は次のようにする必要があります。

if( typeof(b)=="undefined" ){}

と同じ結果が得られます

if( b === undefined ){}

コードにこの追加のテストを含めました http://jsfiddle.net/A89Qj/5/

于 2012-08-31T20:21:17.603 に答える
2
 var a;
 var b = null;

a は未定義、b は完全に null です。

==意図的に緩い方法で等しいかどうかを比較するために使用されます。これはしばしば便利です

alert("3" == 3.0);

これtrueは明らかに違いますが、1 つは数値で、もう 1 つは文字列です。

多くの場合、これは素晴らしいことです。

同様に、多くの場合、何かが未定義であったり、明示的に null に設定されていたりして実際の値がなくても気にしません。

便利な場合もありますが、値だけでなく正確な型の一致を知る必要がある場合もあり===ます。

于 2012-08-31T15:41:27.307 に答える
2

以前の回答を明確にするために、==このように機能する理由は、 とは異なり===型変換を行うためです

于 2012-08-31T15:36:15.710 に答える
1

== の代わりに === を使用する必要があります。=== 演算子は、型変換を行わないことを除いて、== 演算子と同じように動作します。

于 2012-08-31T15:36:23.690 に答える