目前我正在看一本书并且非常困惑并且已经多次尝试理解以下代码。我的第一个困惑实际上是处理比较两个对象 a 和 b 的问题。
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;
}
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
最佳答案
function deepEqual(a, b) {
if (a === b) return true;
首先,我们要检查 a
和 b
是否严格相等(意思是,“指的是完全相同的东西“)。大多数事物,例如字符串和数字,如果相等则将通过此测试; objects 是个异常(exception),因为两个“相同”的对象不一定是相同的对象(它们可以看起来相同)。
if (a == null || typeof a != "object" ||
b == null || typeof b != "object")
return false;
然后我们说,如果两者中的任何一个不是对象,并且它们没有通过最后的测试,那么它们不可能是相同的。同样,对象在这里是异常(exception),因此剩余的代码将处理 a
和 b
都是对象的情况。
var propsInA = 0, propsInB = 0;
for (var prop in a)
propsInA += 1;
这段代码只是计算a
的属性数量。
for (var prop in b) {
propsInB += 1;
if (!(prop in a) || !deepEqual(a[prop], b[prop]))
return false;
}
此代码获取 b
中的每个属性,并检查 a
是否包含具有相同值的相同属性。如果 a
没有 b
所具有的属性,或者它们不同,则这两个对象不能相等。
return propsInA == propsInB;
}
最后,如果a
和b
没有相同数量的属性,那么它们不可能相等。但是,如果它们确实具有相同数量的属性,则 a
和 b
必须相等,因为 a
具有 的所有属性>b
有,而且只有那些。
关于javascript - 比较两个对象看是否相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37930303/