推荐答案
// www.javascriptcn.com code example
function isEqual(a, b) {
// 处理基本类型的比较
if (a === b) return true;
// 处理 null 和 undefined
if (a == null || b == null) return a === b;
// 处理不同类型的比较
if (typeof a !== typeof b) return false;
// 处理数组和对象的深层比较
if (Array.isArray(a) && Array.isArray(b)) {
if (a.length !== b.length) return false;
for (let i = 0; i < a.length; i++) {
if (!isEqual(a[i], b[i])) return false;
}
return true;
}
if (typeof a === 'object') {
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) return false;
for (const key of keysA) {
if (!isEqual(a[key], b[key])) return false;
}
return true;
}
// 其他情况返回 false
return false;
}本题详细解读
1. 基本类型比较
- 使用
=== 严格相等运算符来比较基本类型的值(如 number, string, boolean 等)。
- 如果
a 和 b 严格相等,直接返回 true。
2. 处理 null 和 undefined
- 如果
a 或 b 是 null 或 undefined,直接比较它们是否相等。
- 这样可以避免后续的类型判断错误。
3. 类型不一致的情况
- 如果
a 和 b 的类型不一致,直接返回 false。
4. 数组的深层比较
- 如果
a 和 b 都是数组,首先比较它们的长度是否相等。
- 如果长度不相等,直接返回
false。
- 如果长度相等,递归比较每个元素是否相等。
5. 对象的深层比较
- 如果
a 和 b 都是对象,首先比较它们的键的数量是否相等。
- 如果键的数量不相等,直接返回
false。
- 如果键的数量相等,递归比较每个键对应的值是否相等。
6. 其他情况
- 对于其他情况(如函数、Symbol 等),直接返回
false。
7. 递归调用
- 在数组和对象的比较中,递归调用
isEqual 函数来实现深层比较。
8. 边界情况
- 该函数可以处理大多数常见的数据结构,但对于循环引用的情况可能会出现问题。在实际应用中,可能需要进一步处理循环引用的情况。