TypeError: WeakSet key/WeakMap value 'x' must be an object or an unregistered symbol

當使用了無效型別的值作為 WeakSet 的鍵或 WeakMap 的值時,就會發生 JavaScript 異常 "WeakSet 鍵(或 WeakMap 值)'x' 必須是物件或未註冊的符號"。

訊息

TypeError: Invalid value used as weak map key (V8-based)
TypeError: WeakMap key 1 must be an object or an unregistered symbol (Firefox)
TypeError: WeakMap keys must be objects or non-registered symbols (Safari)

TypeError: Invalid value used in weak set (V8-based)
TypeError: WeakSet value 1 must be an object or an unregistered symbol (Firefox)
TypeError: WeakSet values must be objects or non-registered symbols (Safari)

錯誤型別

TypeError

哪裡出錯了?

WeakSetWeakMap 要求鍵必須是可垃圾回收的。只有物件和未註冊的符號(即,不是由 Symbol.for() 返回的符號)才有效。欲瞭解更多資訊,請參閱記憶體管理。如果你想新增字串、數字或其他原始值作為鍵,你應該將它們儲存在常規的 SetMap 中。

示例

無效案例

js
new WeakSet().add(1); // TypeError
new WeakMap().set(1, {}); // TypeError
new WeakSet([1]); // TypeError
new WeakMap([[1, {}]]); // TypeError

有效情況

js
new WeakSet().add({}); // OK
new WeakMap().set({}, 1); // OK

new Set([1]); // OK
new Map([[1, {}]]); // OK

另見