• NaN 之外,使用[抽象的相等性比较][Abstract Equality Comparison](==)来比较原始值。如果双方均为 NaN,则视为相同。
    • 对象的[类型标签][Object.prototype.toString()]应该相同。
    • 只考虑[可枚举的自身属性][enumerable “own” properties]。
    • 始终比较 [Error] 的名称和消息,即使这些不是可枚举的属性。
    • [对象封装器][Object wrappers]作为对象和解封装后的值都进行比较。
    • Object 属性的比较是无序的。
    • [Map] 键名与 [Set] 子项的比较是无序的。
    • 当两边的值不相同或遇到循环引用时,递归停止。
    • 不测试对象的 [[[Prototype]]][prototype-spec]。
    • 可枚举的自身 [Symbol] 属性也会比较。
    • [WeakMap] 和 [WeakSet] 的比较不依赖于它们的值。

    以下示例不会抛出 [AssertionError],因为[抽象的相等性比较][Abstract Equality Comparison](==)会将原始类型视为相等。

    1. // 不会抛出 AssertionError。
    2. assert.deepEqual('+00000000', false);

    “深度”相等意味着还会比较子对象的可枚举“自有”属性:

    1. const assert = require('assert');
    2. const obj1 = {
    3. a: {
    4. b: 1
    5. }
    6. };
    7. const obj2 = {
    8. a: {
    9. b: 2
    10. }
    11. };
    12. const obj3 = {
    13. a: {
    14. b: 1
    15. }
    16. };
    17. const obj4 = Object.create(obj1);
    18. assert.deepEqual(obj1, obj1);
    19. // OK
    20. // b 的值不同:
    21. assert.deepEqual(obj1, obj2);
    22. // 抛出 AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
    23. assert.deepEqual(obj1, obj3);
    24. // OK
    25. // 原型会被忽略:
    26. assert.deepEqual(obj1, obj4);
    27. // 抛出 AssertionError: { a: { b: 1 } } deepEqual {}

    如果值不相等,则抛出 [AssertionError],并将 message 属性设置为等于 message 参数的值。 如果未定义 message 参数,则会分配默认错误消息。 如果 message 参数是 [Error] 的实例,那么它将被抛出而不是 [AssertionError]。