我正在阅读《Eloquent JavaScript》第三版,尽管我在 SO 上看到过一两个不同的答案,它们在执行逻辑上几乎与我的相同,但无论我如何调整它,我的工作似乎都不起作用。
目标:创建一个深度比较函数,可以比较两个对象,并根据它们的属性确定它们是否是同一类型对象的不同实例(相同的键和值),而不管引用如何......
任何人都可以发现我的代码中的错误吗?
function deepEqual(a,b){
if((typeof a=='object'&& a!=null)&&(typeof b=='object'&& b!=null)){
if(Object.keys(a).length != Object.keys(b).length){return false}
for(let key in a){
if(a[key]==b[key]){
if(!deepEqual(a[key],b[key])){return false}
}else{
return false
}
}
return true
}else if(a!==b){return false}
else{return true}
}
var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true (reads true currently)
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false (reads false currently)
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true (reads false currently)
错误就在这里:
if (a[key] == b[key])
如果它们是对象,即使它们“相等”,条件也可能返回 false。
function deepEqual(a, b) {
if (a && b && typeof a == 'object' && typeof b == 'object') {
if (Object.keys(a).length != Object.keys(b).length) return false;
for (var key in a) if (!deepEqual(a[key], b[key])) return false;
return true;
} else return a === b
}
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)