2011-11-13 4 views
0

私は単純なjson解析オブジェクトを持っています。このオブジェクトには、変数ttが定義されていることがあります。どのように===と==はNULL比較を別々に処理するのですか?

jsonobject.tt == nullは、ttが定義されているかどうかに基づいて、正確に1または0を返します。 jasonobject.tt === nullは、関係なく0を返します。私は===が問題を避けるために使用するものだと思った。

ここでは何が起こっていますか?何らかの理由(jsonobject.tt == null)のために

答えて

2

===に対し、その値と同様型比較し、厳密な等価演算子です。値nullは、ちょうど1つの値 - nullを持つヌルタイプです。

未定義は未定義型で、値も1つしかありません - 未定義です。

厳密な等価演算子を使用する場合、null!==は異なる型であるため、未定義です(厳密な等価比較アルゴリズムのステップ1、ECMA-262§11.9.6を参照)。

==は等価演算子です。含ま抽象等価比較アルゴリズム(11.9.3§ECMA-262)を使用==を使用して比較:

  1. タイプ(X)のタイプ(Y)と同じである場合、次に...
  2. xがnullでyが未定義の場合はtrueを返します。
  3. xが未定義で、yがnullの場合はtrueを返します。

したがってnull == undefinedは、定義によって真を返します。厳密には、プロパティの存在について試験は、(その値に関係なく)、hasOwnPropertyを使用する必要があります

if (jsonobject.hasOwnProperty('tt')) { 
    // property exists 
} 

をしかし実際に未定義ための厳格な試験に大きな違いがありません

if (jsonobject.tt === undefined) 

プロパティが存在し、の値が未定義であるかどうかは、で定義されていないか、まったく定義されていないため、通常は同等です。 ===を使用すると、ttが存在するにもかかわらず、nullの値が割り当てられている場合、上記はfalseを返します。

0

が正しく1または0

を返すまず比較はtrueまたはfalse

第二に、あなたが

jsonobject.tt === undefined

をしたいを返します

値が存在しない場合は未定義です。

他の検出方法==の副作用は全く奇妙なオペレータ、null == undefinedあるとして

!jsonobject.hasOwnProperty("tt");

又は

!("tt" in jsonobject)

あります。したがって、jsonobject.tt == nullは、プロパティが存在しない場合はtrueを返します。

+0

これはコメントであり、回答ではありません。私のコメントを追加している間、あなたの答えを卑劣に更新する。 – zzzzBov

+0

@zzzzBov西の最速の銃を歓迎します。 – Raynos

+0

答えとして短いスニペットを投稿すると、「最も古い」リストの一番上に来るので、より多くの票を獲得する可能性があります。それは主に私がその練習を拒否した理由です。 – zzzzBov

0

変数が定義されていない場合、値はundefinedです。

undefined == null 

undefined !== null 
関連する問題