私はこの質問をチェックしていましたJavascript Deep Comparison質問 者の解決策は私を納得させなかったので、私は問題を分析しようとし、それを思いつきました
var obj = {here: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1}));
// → false
console.log(deepEqual(obj, {here: 2}));
// → true
function deepEqual(a,b)
{
if( (typeof a == 'object' && a != null) &&
(typeof b == 'object' && b != null) )
{
var count = [0,0];
for( var key in a) count[0]++;
for( var key in b) count[1]++;
if( count[0]-count[1] != 0) {console.log('1');return false;}
for( var key in a)
{
if(!(key in b) || !deepEqual(a[key],b[key])) {console.log('2');return false;}
}
for( var key in b)
{
if(!(key in a) || !deepEqual(b[key],a[key])) {console.log('3');return false;}
}
}
console.log('a:'+a+' b:'+b);
return a===b;
}
obj === { here:2 }
このコードは最後のテスト ( console.log(deepEqual(obj, {here: 2})) ) に失敗しますが、メモリ内のインスタンスが異なるにもかかわらず、オブジェクトがそれぞれ等しいキーと値を持っている場合、オブジェクトが完全に等しいと見なすロジックは私を納得させません。私の「解決策」に問題がありますか、それとも間違いは演習の前提にありますか? リンクした質問に記載されているコードは有効ですか?
hikinthru が言及するのを忘れたリソース ( http://eloquentjavascript.net/04_data.html#exercise_deep_compare )