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

Ngoại lệ JavaScript "WeakSet key (or WeakMap value) 'x' must be an object or an unregistered symbol" xảy ra khi một giá trị có kiểu không hợp lệ được sử dụng làm khóa trong WeakSet hoặc làm giá trị trong WeakMap.

Thông báo

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)

Loại lỗi

TypeError

Điều gì đã xảy ra?

WeakSetWeakMap yêu cầu các khóa phải có khả năng thu gom rác. Chỉ các đối tượng và các symbol không được đăng ký (tức là các symbol không được trả về bởi Symbol.for()) là hợp lệ. Để biết thêm thông tin, hãy xem Quản lý bộ nhớ. Nếu bạn muốn thêm các khóa là chuỗi, số hoặc các giá trị nguyên thủy khác, hãy lưu trữ chúng trong Set hoặc Map thông thường.

Ví dụ

Các trường hợp không hợp lệ

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

Các trường hợp hợp lệ

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

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

Xem thêm