2016-09-06 8 views
0

免責事項:私は雄弁Javascriptを読んでいるとエキソサイズの一つはJSのオブジェクトの深いcomparaisonですまあ私は 初級 - JavaScriptでディープcomparaison

JS

で合計初心者です。

があるように定義されたオブジェクトです:

var obj = {here: {is: "an"}, object: 2}; 

、あなたはその内容が等しいかどうかを確認することになっています。 はその後3つのテストがあります。ここでは

console.log(deepEqual(obj, obj)); // supposed to return true 
console.log(deepEqual(obj, {here: 1, object: 2})); // supposed to return false 
console.log(deepEqual(obj, {here: {is: "an"}, object: 2})); // supposed to return true 

は深い等しい方法の私の実装です。私は、オブジェクトを比較仮定簡素化するためには、それは偽それぞれ、真偽と....返し

function deepEqual(obj1,obj2) 
{ 
console.log("========"); 
    for(prop in obj1) 
    { 
    console.log(prop); 
    if (typeof(prop)=="object" && prop!=null) 
    { 
     console.log("Inspecting object ", obj1[prop],obj2[prop]); 
     if (!deepEqual(obj1[prop],obj2[prop])) 
     { 
     return false; 
     } 
    } 
    else 
    { 
     console.log("Inspecting property ",prop,'[',obj1[prop],'][',obj2[prop],']'); 
     if (obj1[prop]!=obj2[prop]) 
     { 
     console.log("Different property"); 
     return false; 
     } 
    } 
    } 
    return true; 
} 

var obj = {here: {is: "an"}, object: 2}; 
console.log(deepEqual(obj, obj)); 
// → true 
console.log(deepEqual(obj, {here: 1, object: 2})); 
// → false 
console.log(deepEqual(obj, {here: {is: "an"}, object: 2})); 
// → true 

(と思う)、彼らが実際の生活の中で習慣と同じ構造を持っていますが、その後、私のメソッドはfalseを返す必要があります!ここで

が出力されます。

======== 
here 
Inspecting property here [ {is: "an"} ][ {is: "an"} ] 
object 
Inspecting property object [ 2 ][ 2 ] 
true 
======== 
here 
Inspecting property here [ {is: "an"} ][ 1 ] 
Different property 
false 
======== 
here 
Inspecting property here [ {is: "an"} ][ {is: "an"} ] 
Different property 
false 

私は理解していない二つのものがあります。

  • なぜそれは常に「検査財産」と決して「対象物を検査しない」ために行くのですか? {is: "an"}はオブジェクトですか?
  • 「obj1 [prop]!= obj2 [prop]」という表現は本当ですが、ログによればそれらはどちらも{is: "an"}と同じですか?

FYI、書籍からの参照実装は次のとおりです。私には

function deepEqual(a, b) { 
    if (a === b) return true; 

    if (a == null || typeof a != "object" || 
     b == null || typeof b != "object") 
    return false; 

    var propsInA = 0, propsInB = 0; 

    for (var prop in a) 
    propsInA += 1; 

    for (var prop in b) { 
    propsInB += 1; 
    if (!(prop in a) || !deepEqual(a[prop], b[prop])) 
     return false; 
    } 

    return propsInA == propsInB; 
} 

はちょうどループの最初のカウントの右にあるどのように多くのプロパティ? 私は2番目のforループ(for(var prop in b))のために完全に混乱しています...

EDIT:おかげでたくさんの回答があります! -

答えて

2

prop(あなたのfor (prop in obj)ループ内の)値はありません - それは鍵(for in loop on MDN)です。

なぜ表現 "OBJ1は[小道具] = obj2の[小道具]!" である真:2番目の質問については

for (var key in obj) { 
    var value = obj[key]; 
} 

for inループを使用する場合は、次のような値を参照します、ログによると、 は、両方とも等しいです:{is: "an"}?

二つのオブジェクト(または任意の他の非プリミティブ値)を比較した場合、それらは、ではない値によって参照によってを比較していることに注意してください:

var obj1 = { name: true }; 
var obj2 = { name: true }; 
obj1 === obj2; 
-> false (obj1 and obj2 are different objects) 

var obj3 = { name: true }; 
var obj4 = obj3; 
obj3 === obj4; 
-> true (obj4 is basically a reference to obj3) 

サイドノートました: JavaScrptの良い習慣は==(抽象的な比較)の代わりに===(厳密な比較)演算子を使用することです。どうして?前者は、比較された値を他の型に暗黙的に変換しないためです。 Javascriptの型変換はそれほど明白ではないので、より予測可能な演算子を使用する方がよいでしょう。厳密な比較を使用すると、JS内のものを比較する一般的に安全な方法です。

トピックon MDNについて詳しく読むことができます。

+0

としてデータ型を無視し、私は=参照によって意味===考えて、 =値によって?では、どのように価値を比較していますか? – Dinaiz

+0

いいえ、それはどのように動作するのではありません。 ** **サイドノート**を読んだり、[比較演算子](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)のドキュメントに直接進むことができます – mdziekon

+0

As '' by value''の比較のために '' deepEqual''関数が基本的に(非プリミティブな値を比較する時に)使用されています。基本値(文字列や数値のような)は**常に**値によって比較されます - '' == ''と '' === ''の違いは型変換です(** **サイドノート**で説明します)。 – mdziekon

1

この行は間違っている:

if (typeof(prop)=="object" && prop!=null) 

propは常に文字列ではなく、プロパティの値であるプロパティのキーです。それは次のようになります。

if (typeof(obj1[prop])=="object" && obj1[prop]!=null) 
+0

説明をありがとう!今それは動作します – Dinaiz

0

私はこの質問に役立つかもしれない偉大な類推があります表現「!OBJ1 [小道具] = obj2のは、[小道具]」 、が、真であるのはなぜ

をログによれば、それらは両方とも{is: "an"}に等しいか?

私と私の兄は、私たちには同じ母親がいると言うことができます。

私とその上の男は、両方が黒いトヨタカムリを持っているので、我々は同じ車を持っていると言うことができます。

My Mother === My Brother's Mother // true, she is really the same person. 

My car === Guy's car    // false, looks the same but 2 different cars 
obj !== {here: {is: "an"}, object: 2} // just looks the same 

===は、このような"3" === 3 // falseとして厳密な等価である... AND ...
==は、このような"3" == 3 // true