Version 5.1.0TC39 Stage 0MIT License
Compares two values and returns true if they are structurally equal.
| Property | Type | Default | Description |
|---|---|---|---|
strict | boolean | false | If true, uses Object.is for primitives (0 differs from -0) |
customComparators | object | {} | Functions (a,b)=>boolean indexed by key or Symbol.for('*') for global |
maxDepth | number | 1000 | Maximum recursion depth |
maxSize | number | 10000 | Maximum elements in collections (Array, Map, Set) |
safe | boolean | true | If true, silences exceptions from getters and returns false |
| Type | Behavior |
|---|---|
| Primitives (number, string, boolean, null, undefined, symbol, bigint) | Comparison via SameValueZero (default) or Object.is (strict mode) |
| Number / Boolean / String wrappers | Compares primitive value via valueOf() |
| Date | Compares getTime() (includes invalid NaN dates) |
| RegExp | Compares source and flags |
| Array | Compares length and enumerable properties |
| Map | Compares entries by deep structural equality of keys and values |
| Set | Verifies each element has a structural equivalent in the other set |
| TypedArrays (all) | Compares length and elements with SameValueZero |
| ArrayBuffer / DataView | Compares bytes |
| Error | Compares name and message |
| WeakMap / WeakSet / Promise | Referential equality only (always false for different instances) |
| Functions | Two different functions are never equal; ignored when both values are functions |
Object.isEqual({a:1,b:{c:2}},{a:1,b:{c:2}}); // true
Object.isEqual(0,-0,{strict:true}); // false
Object.isEqual({id:1,ts:100},{id:1,ts:200},{customComparators:{ts:()=>true}}); // true
var obj={get x(){throw new Error('no')},y:1};
Object.isEqual(obj,obj,{safe:true}); // false (error captured)
| Threat | Mitigation |
|---|---|
| Type spoofing via Symbol.toStringTag | Own-property check before native shortcuts |
| Overridden instance methods | Native methods captured at load time |
| Cross-realm objects | Type detection via Object.prototype.toString |
| Hostile getters | Safe mode captures exceptions |
| DoS (deep recursion/large collections) | Configurable maxDepth and maxSize |
npm install object-is-equal
require('object-is-equal');
console.log(Object.isEqual({a:1},{a:1})); // true
Or include directly in browser:
<script src="object-isEqual.js"></script>