doc: `WeakSet` and `WeakMap` comparison details · nodejs/node@9782639
@@ -799,8 +799,10 @@ are recursively evaluated also by the following rules.
799799* [`Map`][] keys and [`Set`][] items are compared unordered.
800800* Recursion stops when both sides differ or both sides encounter a circular
801801 reference.
802-* [`WeakMap`][] and [`WeakSet`][] comparison does not rely on their values. See
803- below for further details.
802+* [`WeakMap`][] and [`WeakSet`][] instances are **not** compared structurally.
803+ They are only equal if they reference the same object. Any comparison between
804+ different `WeakMap` or `WeakSet` instances will result in inequality,
805+ even if they contain the same entries.
804806* [`RegExp`][] lastIndex, flags, and source are always compared, even if these
805807 are not enumerable properties.
806808@@ -877,23 +879,40 @@ assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 });
877879// }
878880879881const weakMap1 = new WeakMap();
880-const weakMap2 = new WeakMap([[{}, {}]]);
881-const weakMap3 = new WeakMap();
882-weakMap3.unequal = true;
882+const weakMap2 = new WeakMap();
883+const obj = {};
883884885+weakMap1.set(obj, 'value');
886+weakMap2.set(obj, 'value');
887+888+// Comparing different instances fails, even with same contents
884889assert.deepStrictEqual(weakMap1, weakMap2);
885-// OK, because it is impossible to compare the entries
890+// AssertionError: Values have same structure but are not reference-equal:
891+//
892+// WeakMap {
893+// <items unknown>
894+// }
895+896+// Comparing the same instance to itself succeeds
897+assert.deepStrictEqual(weakMap1, weakMap1);
898+// OK
886899887-// Fails because weakMap3 has a property that weakMap1 does not contain:
888-assert.deepStrictEqual(weakMap1, weakMap3);
900+const weakSet1 = new WeakSet();
901+const weakSet2 = new WeakSet();
902+weakSet1.add(obj);
903+weakSet2.add(obj);
904+905+// Comparing different instances fails, even with same contents
906+assert.deepStrictEqual(weakSet1, weakSet2);
889907// AssertionError: Expected inputs to be strictly deep-equal:
890908// + actual - expected
891909//
892-// WeakMap {
893-// + [items unknown]
894-// - [items unknown],
895-// - unequal: true
896-// }
910+// + WeakSet { <items unknown> }
911+// - WeakSet { <items unknown> }
912+913+// Comparing the same instance to itself succeeds
914+assert.deepStrictEqual(weakSet1, weakSet1);
915+// OK
897916```
898917899918```cjs
@@ -969,23 +988,40 @@ assert.deepStrictEqual({ [symbol1]: 1 }, { [symbol2]: 1 });
969988// }
970989971990const weakMap1 = new WeakMap();
972-const weakMap2 = new WeakMap([[{}, {}]]);
973-const weakMap3 = new WeakMap();
974-weakMap3.unequal = true;
991+const weakMap2 = new WeakMap();
992+const obj = {};
975993994+weakMap1.set(obj, 'value');
995+weakMap2.set(obj, 'value');
996+997+// Comparing different instances fails, even with same contents
976998assert.deepStrictEqual(weakMap1, weakMap2);
977-// OK, because it is impossible to compare the entries
999+// AssertionError: Values have same structure but are not reference-equal:
1000+//
1001+// WeakMap {
1002+// <items unknown>
1003+// }
1004+1005+// Comparing the same instance to itself succeeds
1006+assert.deepStrictEqual(weakMap1, weakMap1);
1007+// OK
9781008979-// Fails because weakMap3 has a property that weakMap1 does not contain:
980-assert.deepStrictEqual(weakMap1, weakMap3);
1009+const weakSet1 = new WeakSet();
1010+const weakSet2 = new WeakSet();
1011+weakSet1.add(obj);
1012+weakSet2.add(obj);
1013+1014+// Comparing different instances fails, even with same contents
1015+assert.deepStrictEqual(weakSet1, weakSet2);
9811016// AssertionError: Expected inputs to be strictly deep-equal:
9821017// + actual - expected
9831018//
984-// WeakMap {
985-// + [items unknown]
986-// - [items unknown],
987-// - unequal: true
988-// }
1019+// + WeakSet { <items unknown> }
1020+// - WeakSet { <items unknown> }
1021+1022+// Comparing the same instance to itself succeeds
1023+assert.deepStrictEqual(weakSet1, weakSet1);
1024+// OK
9891025```
99010269911027If the values are not equal, an [`AssertionError`][] is thrown with a `message`