當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Node.js assert.deepEqual(actual, expected[, message])用法及代碼示例


assert.deepEqual(actual, expected[, message])

曆史
版本變化
v18.0.0

現在也比較正則表達式 lastIndex 屬性。

v16.0.0、v14.18.0

在 Legacy 斷言模式下,將狀態從 Deprecated 更改為 Legacy。

v14.0.0

NaN 現在如果兩邊都是 NaN 則被視為相同。

v12.0.0

現在可以正確比較類型標簽,並且進行了一些小的比較調整以使檢查不那麽令人驚訝。

v9.0.0

Error 名稱和消息現在可以正確比較。

v8.0.0

還比較了SetMap 的內容。

v6.4.0、v4.7.1

現在可以正確處理類型化的數組切片。

v6.1.0、v4.5.0

具有循環引用的對象現在可以用作輸入。

v5.10.1、v4.4.3

正確處理非Uint8Array 類型的數組。

v0.1.21

添加於:v0.1.21


參數

嚴格的斷言模式

assert.deepStrictEqual() 的別名。

傳統斷言模式

測試 actualexpected 參數之間的深度相等性。考慮改用 assert.deepStrictEqual() assert.deepEqual() 可以產生令人驚訝的結果。

深度相等意味著子對象的可枚舉"own" 屬性也由以下規則遞歸評估。

比較細節#

  • 原始值與== 運算符, 除了NaN.如果雙方都是相同的,則視為相同NaN.
  • Type tags 個對象應該相同。
  • 僅考慮 enumerable "own" properties
  • Error 名稱和消息總是被比較,即使它們不是可枚舉的屬性。
  • Object wrappers 作為對象和展開的值進行比較。
  • Object 屬性比較無序。
  • Map 鍵和 Set 項是無序比較的。
  • 當雙方不同或雙方遇到循環引用時,遞歸停止。
  • 實現不測試對象的 [[Prototype]]
  • Symbol 屬性不進行比較。
  • WeakMap WeakSet 比較不依賴於它們的值。
  • RegExp lastIndex、標誌和源始終進行比較,即使這些不是可枚舉的屬性。

以下示例不拋出AssertionError因為基元是使用== 運算符.

import assert from 'node:assert';
// WARNING: This does not throw an AssertionError!

assert.deepEqual('+00000000', false);const assert = require('node:assert');
// WARNING: This does not throw an AssertionError!

assert.deepEqual('+00000000', false);

"Deep" 相等意味著子對象的可枚舉"own" 屬性也被評估:

import assert from 'node:assert';

const obj1 = {
  a: {
    b: 1
  }
};
const obj2 = {
  a: {
    b: 2
  }
};
const obj3 = {
  a: {
    b: 1
  }
};
const obj4 = Object.create(obj1);

assert.deepEqual(obj1, obj1);
// OK

// Values of b are different:
assert.deepEqual(obj1, obj2);
// AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }

assert.deepEqual(obj1, obj3);
// OK

// Prototypes are ignored:
assert.deepEqual(obj1, obj4);
// AssertionError: { a: { b: 1 } } deepEqual {}const assert = require('node:assert');

const obj1 = {
  a: {
    b: 1
  }
};
const obj2 = {
  a: {
    b: 2
  }
};
const obj3 = {
  a: {
    b: 1
  }
};
const obj4 = Object.create(obj1);

assert.deepEqual(obj1, obj1);
// OK

// Values of b are different:
assert.deepEqual(obj1, obj2);
// AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }

assert.deepEqual(obj1, obj3);
// OK

// Prototypes are ignored:
assert.deepEqual(obj1, obj4);
// AssertionError: { a: { b: 1 } } deepEqual {}

如果這些值不相等,則會拋出一個 AssertionError ,並將 message 屬性設置為等於 message 參數的值。如果 message 參數未定義,則分配默認錯誤消息。如果 message 參數是 Error 的實例,那麽它將被拋出而不是 AssertionError

相關用法


注:本文由純淨天空篩選整理自nodejs.org大神的英文原創作品 assert.deepEqual(actual, expected[, message])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。