给对象保存临时状态,不一定要把字段直接加到对象上。比如待办事项需要一个 focused 状态,但存回数据库时不希望带上它,可以用对象本身作键,把状态单独放进… · @BaiBtw · TwKit
@BaiBtw
给对象保存临时状态,不一定要把字段直接加到对象上。比如待办事项需要一个 focused 状态,但存回数据库时不希望带上它,可以用对象本身作键,把状态单独放进 Map 或 WeakMap。 写成 const meta = new WeakMap(); 再调用 meta.set(todo, { focused: true }),就能用 meta.get(todo) 取回状态,不必修改 todo。键按对象身份区分:另建一个内容相同的对象,也不是同一个键。 Map 会保留对键对象的强引用;只要这个 Map 和条目还在,即使其他地方不再使用对象,也可能把它继续留在内存里。WeakMap 不会仅因为对象被用作键,就阻止它被垃圾回收。键被回收后,对应值如果没有被其他地方强引用,也可以被回收。 WeakMap 的键只能是对象或未注册的 Symbol,字符串和数字不行。它也不能列出所有键、遍历条目,或读取 size;需要这些能力时,仍要用 Map。 “弱”不意味着值随时会消失:只要键对象仍然存活,对应值就仍会被保留。它适合生命周期跟着对象走的元数据,不是能按容量淘汰的通用缓存,也不能保证某个时刻立即释放内存。
曝光 18 · 评论 0 · 点赞 1 · 书签 0
查看原帖