如何理解 WeakSet 不可遍历且没有 size 属性的设计原因
WeakSet 不提供 size 和遍历能力因其设计目标是“弱存在性登记册”仅通过 has() 判断对象是否尚未被 GC 回收size 不稳定、遍历会引发强引用故规范禁止 clear、迭代器等操作且只接受对象类型。WeakSet 为什么连 size 都不给因为它根本不能、也不该知道“自己存了几个对象”。WeakSet 的设计目标不是做容器而是做“弱存在性登记册”——只管记一笔“这个对象我见过”但绝不阻拦 GC 回收它。一旦对象被回收对应条目就自动消失size 就失去了稳定定义的基础。GC 可能在任意时刻清理对象size 值随时可能突变返回一个瞬间过期的数字反而误导人如果暴露 size引擎就必须在内部维护计数器这会引入额外同步开销违背“轻量弱引用”的初衷所有主流引擎V8、SpiderMonkey、JavaScriptCore都刻意不实现 size不是遗漏是共识遍历 WeakSet 为什么被彻底禁止因为遍历行为本身就会构成强引用——你正在“访问”它引擎无法判断你是想读数据还是无意中把它钉在内存里。所以连 keys()、values()、forEach()、[Symbol.iterator] 全部砍掉。哪怕只是写 for (const item of weakSet) { ... }语法上就直接报 TypeError: weakSet is not iterableArray.from(weakSet) 同样失败因为依赖迭代器接口这不是兼容性问题是语言规范硬性限制ECMA-262 §23.4.1.1任何 polyfill 都无法真正模拟那怎么知道某个对象还在不在 WeakSet 里唯一合法且安全的方式只有 has()。它不触发遍历不暴露数量只做一次弱引用快照比对。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2504952.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!