diff --git a/doc/api/assert.md b/doc/api/assert.md index 0bf1103a97e827..254d4faf98bfbf 100644 --- a/doc/api/assert.md +++ b/doc/api/assert.md @@ -20,6 +20,9 @@ An alias of [`assert.ok()`][]. * `actual` {any} * `expected` {any} @@ -392,6 +417,25 @@ parameter is undefined, a default error message is assigned. ## assert.notDeepStrictEqual(actual, expected[, message]) * `actual` {any} * `expected` {any} diff --git a/lib/assert.js b/lib/assert.js index 7ba7ebadf10a9b..2c52fcc19996f9 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -167,8 +167,11 @@ function isObjectOrArrayTag(tag) { // a) The same built-in type tags // b) The same prototypes. function strictDeepEqual(actual, expected) { - if (actual === null || expected === null || - typeof actual !== 'object' || typeof expected !== 'object') { + if (typeof actual !== 'object') { + return typeof actual === 'number' && Number.isNaN(actual) && + Number.isNaN(expected); + } + if (typeof expected !== 'object' || actual === null || expected === null) { return false; } const actualTag = objectToString(actual); diff --git a/test/parallel/test-assert-deep.js b/test/parallel/test-assert-deep.js index 9f1fe29a7769e6..46249bbd55a664 100644 --- a/test/parallel/test-assert-deep.js +++ b/test/parallel/test-assert-deep.js @@ -466,6 +466,7 @@ assertOnlyDeepEqual( assertDeepAndStrictEqual(m3, m4); } +// Handle sparse arrays assertDeepAndStrictEqual([1, , , 3], [1, , , 3]); assertOnlyDeepEqual([1, , , 3], [1, , , 3, , , ]); @@ -481,4 +482,11 @@ assertOnlyDeepEqual([1, , , 3], [1, , , 3, , , ]); assertOnlyDeepEqual(err1, {}, assert.AssertionError); } +// Handle NaN +assert.throws(() => { assert.deepEqual(NaN, NaN); }, assert.AssertionError); +assert.doesNotThrow(() => { assert.deepStrictEqual(NaN, NaN); }); +assert.doesNotThrow(() => { assert.deepStrictEqual({ a: NaN }, { a: NaN }); }); +assert.doesNotThrow( + () => { assert.deepStrictEqual([ 1, 2, NaN, 4 ], [ 1, 2, NaN, 4 ]); }); + /* eslint-enable */