2020-07-09
描述
对两个值进行深度对比,以判断他们是否相等。
提示
- 检查两个值是否全等
- 如果他们都表示为同一时间的
Date
对象,则需使用Date.getTime()
进行检测 - 如果他们的值都不是对象的话,需要使用全等(严格比较)进行检测
- 检查其中的一个值是否为
null
或者undefined
- 检查他们的属性是否不同
- 如果以上条件都不满足,就需要使用
Object.keys()
来检测他们是否有相同数量的键 - 最后需通过
Array.prototype.every()
来递归调用equals
方法,以判断他们的每一个值是否相等
代码
const equals = (a, b) => {
if (a === b) return true;
if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) return a === b;
if (a.prototype !== b.prototype) return false;
let keys = Object.keys(a);
if (keys.length !== Object.keys(b).length) return false;
return keys.every(k => equals(a[k], b[k]));
};
示例
检测以下两组值是否相等:
equals({ a: [2, { e: 3 }], b: [4], c: 'foo' }, { a: [2, { e: 3 }], b: [4], c: 'foo' }); // true
equals([1, 2, 3], { 0: 1, 1: 2, 2: 3 }); // true