isEqual() function
在 a 和 b 之间执行深度相等比较(deep equality comparison)。
不同于执行部分比较的 isMatch(source 只需匹配属性的子集),isEqual 要求双向完全相等:对象必须拥有相同的键集合,数组必须具有相同的长度和顺序,Map/Set 必须具有相同的大小。
支持的类型:原始值(NaN 视为等于 NaN)、Object(包括嵌套,键顺序无关)、Array(顺序敏感)、Date(通过 getTime 比较)、RegExp(通过 source 和 flags 比较)、Map(深度比较键和值)、Set(顺序无关)。不同类型的值永远不相等,函数仅按引用比较。
Signature:
typescript
function isEqual(a: unknown, b: unknown): boolean;Example
ts
// 原始值 (NaN 等于 NaN)
isEqual(1, 1); // true
isEqual(NaN, NaN); // true
isEqual("a", "b"); // false
// 完全相等,不同于 isMatch 的部分匹配
isEqual({ a: 1, b: 2 }, { a: 1 }); // false - 键数量不同
isMatch({ a: 1, b: 2 }, { a: 1 }); // true - 子集即可
// 嵌套对象(键顺序无关)
isEqual({ a: 1, b: { c: 2 } }, { b: { c: 2 }, a: 1 }); // true
isEqual({ a: 1 }, { a: 1, b: undefined }); // false - 键数量不同
// 数组(顺序敏感)
isEqual([1, 2, 3], [1, 2, 3]); // true
isEqual([1, 2, 3], [3, 2, 1]); // false
// Date 和 RegExp
isEqual(new Date(1000), new Date(1000)); // true
isEqual(/abc/gi, /abc/gi); // true
// Map(深度比较键和值)
isEqual(new Map([[{ a: 1 }, 1]]), new Map([[{ a: 1 }, 1]])); // true
// Set(顺序无关)
isEqual(new Set([1, 2, 3]), new Set([3, 2, 1])); // true
// 不同类型永远不相等
isEqual(new Date(0), {}); // false
isEqual(null, {}); // false