M
assert.deepStrictEqual
History
Added in: v1.2.0
v1.2.0
Introduced in: v0.1.21
v0.1.21
Message may now be a
printf-like format string or function.v25.1.0
Promises are not considered equal anymore if they are not of the same instance.
v25.0.0
Invalid dates are now considered equal.
v25.0.0
Recursion now stops when either side encounters a circular reference.
v24.0.0
Error cause and errors properties are now compared as well.
v22.2.0, v20.15.0
Regular expressions lastIndex property is now compared as well.
v18.0.0
Enumerable symbol properties are now compared.
v9.0.0
The
NaN is now compared using the SameValueZero comparison.v9.0.0
The
Error names and messages are now properly compared.v8.5.0
The
Set and Map content is also compared.v8.0.0
Typed array slices are handled correctly now.
v6.4.0, v4.7.1
Objects with circular references can be used as inputs now.
v6.1.0
Handle non-
Uint8Array typed arrays correctly.v5.10.1, v4.4.3
assert.deepStrictEqual(actual, expected, message?): void
Attributes
Tests for deep equality between the actual and expected parameters.
"Deep" equality means that the enumerable "own" properties of child objects
are recursively evaluated also by the following rules.
- Primitive values are compared using
Object.is(). - Type tags of objects should be the same.
[[Prototype]]of objects are compared using the===operator.- Only enumerable "own" properties are considered.
- Object constructors are compared when available.
Errornames, messages, causes, and errors are always compared, even if these are not enumerable properties.errorsis also compared.- Enumerable own
Symbolproperties are compared as well. - Object wrappers are compared both as objects and unwrapped values.
Objectproperties are compared unordered.Mapkeys andSetitems are compared unordered.- Recursion stops when both sides differ or either side encounters a circular reference.
WeakMap,WeakSetandPromiseinstances are not compared structurally. They are only equal if they reference the same object. Any comparison between differentWeakMap,WeakSet, orPromiseinstances will result in inequality, even if they contain the same content.RegExplastIndex, flags, and source are always compared, even if these are not enumerable properties.
import assert from 'node:assert/strict'; // This fails because 1 !== '1'. assert.deepStrictEqual({ a: 1 }, { a: '1' }); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // { // + a: 1 // - a: '1' // } // The following objects don't have own properties const date = new Date(); const object = {}; const fakeDate = {}; Object.setPrototypeOf(fakeDate, Date.prototype); // Different [[Prototype]]: assert.deepStrictEqual(object, fakeDate); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + {} // - Date {} // Different type tags: assert.deepStrictEqual(date, fakeDate); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + 2018-04-26T00:49:08.604Z // - Date {} assert.deepStrictEqual(NaN, NaN); // OK because Object.is(NaN, NaN) is true. // Different unwrapped numbers: assert.deepStrictEqual(new Number(1), new Number(2)); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + [Number: 1] // - [Number: 2] assert.deepStrictEqual(new String('foo'), Object('foo')); // OK because the object and the string are identical when unwrapped. assert.deepStrictEqual(-0, -0); // OK // Different zeros: assert.deepStrictEqual(0, -0); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + 0 // - -0 const symbol1 = Symbol(); const symbol2 = Symbol(); assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 }); // OK, because it is the same symbol on both objects. assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 }); // AssertionError [ERR_ASSERTION]: Inputs identical but not reference equal: // // { // Symbol(): 1 // } const weakMap1 = new WeakMap(); const weakMap2 = new WeakMap(); const obj = {}; weakMap1.set(obj, 'value'); weakMap2.set(obj, 'value'); // Comparing different instances fails, even with same contents assert.deepStrictEqual(weakMap1, weakMap2); // AssertionError: Values have same structure but are not reference-equal: // // WeakMap { // <items unknown> // } // Comparing the same instance to itself succeeds assert.deepStrictEqual(weakMap1, weakMap1); // OK const weakSet1 = new WeakSet(); const weakSet2 = new WeakSet(); weakSet1.add(obj); weakSet2.add(obj); // Comparing different instances fails, even with same contents assert.deepStrictEqual(weakSet1, weakSet2); // AssertionError: Values have same structure but are not reference-equal: // + actual - expected // // WeakSet { // <items unknown> // } // Comparing the same instance to itself succeeds assert.deepStrictEqual(weakSet1, weakSet1); // OK
const assert = require('node:assert/strict'); // This fails because 1 !== '1'. assert.deepStrictEqual({ a: 1 }, { a: '1' }); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // { // + a: 1 // - a: '1' // } // The following objects don't have own properties const date = new Date(); const object = {}; const fakeDate = {}; Object.setPrototypeOf(fakeDate, Date.prototype); // Different [[Prototype]]: assert.deepStrictEqual(object, fakeDate); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + {} // - Date {} // Different type tags: assert.deepStrictEqual(date, fakeDate); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + 2018-04-26T00:49:08.604Z // - Date {} assert.deepStrictEqual(NaN, NaN); // OK because Object.is(NaN, NaN) is true. // Different unwrapped numbers: assert.deepStrictEqual(new Number(1), new Number(2)); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + [Number: 1] // - [Number: 2] assert.deepStrictEqual(new String('foo'), Object('foo')); // OK because the object and the string are identical when unwrapped. assert.deepStrictEqual(-0, -0); // OK // Different zeros: assert.deepStrictEqual(0, -0); // AssertionError: Expected inputs to be strictly deep-equal: // + actual - expected // // + 0 // - -0 const symbol1 = Symbol(); const symbol2 = Symbol(); assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol1]: 1 }); // OK, because it is the same symbol on both objects. assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 }); // AssertionError [ERR_ASSERTION]: Inputs identical but not reference equal: // // { // Symbol(): 1 // } const weakMap1 = new WeakMap(); const weakMap2 = new WeakMap(); const obj = {}; weakMap1.set(obj, 'value'); weakMap2.set(obj, 'value'); // Comparing different instances fails, even with same contents assert.deepStrictEqual(weakMap1, weakMap2); // AssertionError: Values have same structure but are not reference-equal: // // WeakMap { // <items unknown> // } // Comparing the same instance to itself succeeds assert.deepStrictEqual(weakMap1, weakMap1); // OK const weakSet1 = new WeakSet(); const weakSet2 = new WeakSet(); weakSet1.add(obj); weakSet2.add(obj); // Comparing different instances fails, even with same contents assert.deepStrictEqual(weakSet1, weakSet2); // AssertionError: Values have same structure but are not reference-equal: // + actual - expected // // WeakSet { // <items unknown> // } // Comparing the same instance to itself succeeds assert.deepStrictEqual(weakSet1, weakSet1); // OK
If the values are not equal, an AssertionError is thrown with a message
property set equal to the value of the message parameter. If the message
parameter is undefined, a default error message is assigned. If the message
parameter is an instance of Error then it will be thrown instead of the
AssertionError.