2012-05-12 12 views
1

間の平等の比較私たちは、同じプロパティを持つ2つのオブジェクトを推測してみましょう:Javascriptを:2つのObject /アレイ

var x = {a : 'some'}, 
     y = {a: 'some'}; 

出力:

x == y;x === y;が両方2つの配列、

のために偽

同様に与えます

var p = [1, 2, 3], 
     q = [1,2,3]; 

p == qおよびp === qは両方ともfalseとなる。

しかし、私は次の操作を実行した場合のために:

var x = y = {a: 'some'}; 
var p = q = [1, 2, 3]; 

を全て比較trueを与える上。

なぜJavascriptはこのようなことをしますか?説明してください。

答えて

5

上記の全ては、trueである。

右。具体的にはpqを設定して、同じオブジェクトを参照しています。オブジェクト参照で

==(両側がオブジェクト参照である場合)、===両方が参照が同じオブジェクトを指しているかどうかを確認します。同一の2つのオブジェクトがある場合は、どちらも常にfalseになります。

だから例えば:

var a = {}; // a points to an object 
var b = {}; // b points to a _different_ object 
console.log(a === b); // "false" 
console.log(a == b); // "false" 

var c = {}; // c points to an object 
var d = c; // d points to _the same_ object 
console.log(c === d); // "true" 
console.log(c == d); // "true" 

オブジェクトの内容は無関係である、それがチェックされています彼らの正体です。

==を使用し、一方の側のみがオブジェクト参照(たとえば、もう一方の側が数字、プリミティブストリング、undefinedなど)である場合は、これは当てはまりません。その場合、オブジェクト参照は、それ自体を変換するか(他のものに応じて文字列または数値に変換されます)、変換された結果が比較に使用されます。これは、驚くべき振る舞いにつながります(例えば、"2" == [[[[[2]]]]]trueです)。配列は文字列に変換されるため、join [要素自体に文字列に変換するように要求するなどの処理を行います。最後に"2"となります)。私は典型的=====(「厳密な等価」(「ルーズ平等」)を好む。

+1

いや、VAR X = { '一部'}、Y = { '一部'}。 2つの異なったメモリを指していますが、同様のオブジェクトです。 – benqus

3

var p = [1, 2, 3], 
q = [1,2,3]; 

は、アレイの2つのインスタンスを作成するため、これが起こる。等価演算子JSにおいて、非プリミティブデータを比較した場合それらが同じインスタンスであるかどうかをチェックするだけで、値やプロパティを詳細にチェックしないでください。あなたは、配列の1つのインスタンスを作成し、変数pqに、このインスタンスを割り当てているコード

var p = q = [1, 2, 3]; 

。したがって、両方の変数は同じインスタンスへの参照を格納するため、等価演算子はtrueを返します。

+0

+1。詳細はこちら[https://developer.mozilla.org/ja/JavaScript/Reference/Operators/Comparison_Operators]を参照してください。 – Amadan

2

この場合、変数は2つの別々のオブジェクトを指しているため、等しくはありません。

var x = {a:'some'}, // one object with "a" = "some" 
    y = {a:'some'}; // another object with "a" = "some" 

var p = [1,2,3], // one array with 1,2 and 3 
    q = [1,2,3]; // another array with 1,2 and 3 

しかし、この場合には、それらは同じオブジェクトを指し、従って等しい

var x = y = {a: 'some'}; 
//is like: 
var x = {a:'some'}, // x points to an object 
    y = x;   // y is given reference to whatever x is pointing at 


var p = q = [1,2,3]; 
//is like: 
var p = [1,2,3], // p points to an array 
    q = p;   // q is given reference to whatever p is pointing at