TypeError: WeakSet 键/WeakMap 值 'x' 必须是对象或未注册的符号

当在 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)

错误类型

哪里出错了?

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

另请参阅