本Eloquent Javascriptを含むさまざまなリソースから JS を独学しています。第 4 章の問題セットでは、質問 4 で尋ねます。
2 つの値を取り、それらが同じ値であるか、deepEqual の再帰呼び出しと比較したときに値が等しい同じプロパティを持つオブジェクトである場合にのみ true を返す関数、deepEqual を記述します。
2 つのものを ID で比較する (=== 演算子を使用) か、それらのプロパティを見て比較するかを調べるには、typeof 演算子を使用できます。両方の値に対して「オブジェクト」が生成される場合は、詳細な比較を行う必要があります。ただし、1 つのばかげた例外を考慮する必要があります。歴史的な事故により、typeof null も「オブジェクト」を生成します。
私はこれを行い、pythonTutor を使用して特定のソリューションとさまざまなテスト ケースを分析し、アプローチをよりよく理解しました。私の質問は、以下のコードの変数propInA & propInBに関するものです。
function deepEqual (a,b) {
if (a===b) return true;
else if (a === null || b === null || typeof a !== "object" || typeof b !== "object") return false;
else {
let propInA = 0, propInB = 0
for (var prop in a) {
**propInA** +=1;
}
for (prop in b) {
**propInB** +=1;
if (!(**propInA**) || !deepEqual(a[prop], b[prop])) return false;
} return **propInA** == **propInB**;
}
}
console.log(deepEqual({here: {is: "an"}, object: 2, guy: 47}, {here: {is: "an"}, object: 2}));
// → false
私が理解しているように、これらの変数はカウンターとして機能するため、このコードの下部にあるテスト ケースを実行すると、最初の引数の追加のプロパティ ("guy") によって、両方のオブジェクト間のプロパティの数が等しくなくなります。したがって、deepEqual は false を返します。
この場合、関数が再帰的に呼び出される「if...」ステートメントの!(propInA)の関数は何ですか?
if (!(**propInA**) || !deepEqual(a[prop], b[prop])) return false;
この変数の値は数値なので、本質的には「3 が真でなければ再帰関数を呼び出す...」ということではないでしょうか? ここで何が欠けていますか?