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
哪里出错了?
WeakSet 和 WeakMap 要求键必须是可垃圾回收的。只有对象和未注册的符号(即,不是由 Symbol.for() 返回的符号)才有效。欲了解更多信息,请参阅内存管理。如果你想添加字符串、数字或其他原始值作为键,你应该将它们存储在常规的 Set 或 Map 中。
示例
无效案例
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