目前我正在关注一本书并且非常困惑,并且多次尝试了解以下代码.我的第一个困惑实际上是接近比较两个对象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
Run Code Online (Sandbox Code Playgroud)
function deepEqual(a, b) {
if (a === b) return true;
Run Code Online (Sandbox Code Playgroud)
首先,我们检查a和b是否严格相等(意思是“指的是完全相同的事物”)。大多数事物,例如字符串和数字,如果它们相等,就会通过此测试;对象是例外,因为两个“相同”的对象不一定是同一个对象(它们可以只是看起来相同)。
if (a == null || typeof a != "object" ||
b == null || typeof b != "object")
return false;
Run Code Online (Sandbox Code Playgroud)
然后我们说,如果两者中的任何一个都不是对象,并且它们没有通过最后一次测试,那么它们不可能是相同的。同样,这里的对象是例外,因此剩余的代码将处理a和b都是对象的情况。
var propsInA = 0, propsInB = 0;
for (var prop in a)
propsInA += 1;
Run Code Online (Sandbox Code Playgroud)
这段代码只是简单地计算 的属性数量a。
for (var prop in b) {
propsInB += 1;
if (!(prop in a) || !deepEqual(a[prop], b[prop]))
return false;
}
Run Code Online (Sandbox Code Playgroud)
此代码获取 中的每个属性b,并检查是否a包含具有相同值的相同属性。如果a不具有b具有的属性,或者它们不同,则这两个对象不能相等。
return propsInA == propsInB;
}
Run Code Online (Sandbox Code Playgroud)
最后,如果a和b不具有相同数量的属性,则它们不能相等。但是,如果它们确实具有相同数量的属性,则a和b必须相等,因为a具有 的所有属性b,并且只有那些。
| 归档时间: |
|
| 查看次数: |
5095 次 |
| 最近记录: |