equals
Performs a deep comparison between two values to determine if they are equivalent.
Check if the two values are identical, if they are both Date
objects with the same time, using Date.getTime()
or if they are both non-object values with an equivalent value (strict comparison).
Check if only one value is null
or undefined
or if their prototypes differ.
If none of the above conditions are met, use Object.keys()
to check if both values have the same number of keys, then use Array.prototype.every()
to check if every key in the first value exists in the second one and if they are equivalent by calling this method recursively.
typescript
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]));
};
typescript
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
// equals(1, "1");// compile error
deepEquals(1, "1"); //false// no compile error