yuxuannnn_utils
Version:
45 lines (44 loc) • 1.47 kB
JavaScript
;
function deepDiff(obj1, obj2) {
if (typeof obj1 !== typeof obj2) {
// 两者数据类型都不一致
return false;
}
else if (typeof obj1 === 'function') {
// 两者都是函数直接比较引用
return obj1 === obj2;
}
else if (typeof obj1 !== 'object') {
// 基本数据类型
return obj1 === obj2;
}
else if (Array.isArray(obj1) && Array.isArray(obj2)) {
// 两者都是数组
if (obj1.length !== obj2.length) {
return false;
}
return obj1.every((it, i) => deepDiff(it, obj2[i])); // 每一项对比都一样返回true
}
else if (Array.isArray(obj1) !== Array.isArray(obj1)) {
// 一个数组 一个对象
return false;
}
else {
// 两个都是对象
if (obj1 === obj2) {
// 引用一致
return true;
}
else {
// 对每个属性进行比对
// 这里其实还要考虑符号属性和不可枚举属性 简化一下
const props1 = Object.keys(obj1);
const props2 = Object.keys(obj2);
if (props1.length !== props2.length) {
// 可枚举属性长度不一致
return false;
}
return props1.every((prop) => deepDiff(obj1[prop], obj2[prop])); // 逐一比较各个属性
}
}
}