2017-08-05 20 views
2

オブジェクトはそこには値が存在しないため参照が等しい。2つのオブジェクトの等価性

var obj1 = {name: 'Yousef', age: 15}, 

    obj2 = {name: 'Yousef', age: 15}; 

console.log(obj1 === obj2); // The Result will be false 

しかし、このルールは、DOMに適用されていないようだオブジェクト:

var div1 = document.querySelector('div'), 

    div2 = document.querySelector('div'); 

console.log(div1 === div2); // The Result will be True! 

誰もが理由を説明することはできますか?

+5

これらは同じオブジェクトなので、 – Li357

+0

obj1はobj2と同じ値を持ちますが、同じ参照を持たないので等しくはありません –

+0

はい、同じ参照を持ちます - 同じ*は同じDIVを指しています*。 – Li357

答えて

5

あなたの最初の例は、2つの別々のオブジェクトを比較するのと同じオブジェクトです。あなたのDOMの例では、オブジェクトをそれ自身と比較しています()。 querySelectorを作成しませんオブジェクトを作成すると、が既に存在するオブジェクトへの参照がDOMツリーにとして返されます。

あなたのDOMの例と同等のこの次のようになります。

function findElement(element, tag) { 
 
    for (var n = 0; n < element.children.length; ++n) { 
 
     var child = element.children[n]; 
 
     if (child.tag === tag) { 
 
      return child; 
 
     } 
 
    } 
 
    return null; 
 
} 
 

 
var tree = { 
 
    children: [ 
 
     { 
 
      tag: "child", 
 
      name: "I'm the child element", 
 
      children: [] 
 
     } 
 
    ] 
 
}; 
 

 
var obj1 = findElement(tree, "child"); 
 
var obj2 = findElement(tree, "child"); 
 
console.log(obj1 === obj2); // true

3

querySelectorを使用すると、クエリに一致する最初のDOM要素のみが見つかるためです。

だから、DIV1とDIV2は

+0

彼らは同じ値を持っていますが、同じ参照ではありませんので、同じであってはいけません! –

+2

@ YousefEssam:いいえ、** **同じオブジェクト参照です。 –

+0

DOMはオブジェクトです。 querySelectorを使用すると、内部およびオブジェクトのオブジェクトを検索します。 div1とdiv2は同じオブジェクトへのリンクです。しかし、obj1とobj2では、同じ値を持つ2つのオブジェクトを作成し、RAM内に2つの異なる場所をとります – sheplu

1

docs

は、指定された一致した文書内の最初の要素を返しますからのを理解してみましょうセレクタ、またはセレクタのグループ。

何回呼び出しても、同じ要素が得られますか?

はいです。 querySelectorはオブジェクトを作成せず、DOMをたどるだけで一致したオブジェクトを返します。マッチングは、文書のマークアップ内の最初の要素で文書のノードの深さ優先プリオーダートラバーサルを使用して行われ、子ノードの量の順序によって順次ノードを介して反復される。また、DOC

注に記載さもこの時点)。

最初に、自分でオブジェクトを作成します。

関連する問題