免責事項:私は雄弁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:おかげでたくさんの回答があります! -
としてデータ型を無視し、私は=参照によって意味===考えて、 =値によって?では、どのように価値を比較していますか? – Dinaiz
いいえ、それはどのように動作するのではありません。 ** **サイドノート**を読んだり、[比較演算子](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)のドキュメントに直接進むことができます – mdziekon
As '' by value''の比較のために '' deepEqual''関数が基本的に(非プリミティブな値を比較する時に)使用されています。基本値(文字列や数値のような)は**常に**値によって比較されます - '' == ''と '' === ''の違いは型変換です(** **サイドノート**で説明します)。 – mdziekon