1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

Merge pull request #1052 from codeudan/gh-pages

docs(set-map): 改进 WeakSet 和 WeakMap 文档
This commit is contained in:
Ruan YiFeng 2021-05-12 08:31:44 +08:00 committed by GitHub
commit e6b02106fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -322,7 +322,7 @@ ws.add(Symbol())
其次WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
这是因为垃圾回收机制依赖引用计数,如果一个值的引用次数不为`0`垃圾回收机制就不会释放这块内存。结束使用该值之后有时会忘记取消引用导致内存无法释放进而可能会引发内存泄漏。WeakSet 里面的引用都不计入垃圾回收机制所以就不存在这个问题。因此WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。
这是因为垃圾回收机制根据对象的可达性Reachability来判断回收如果对象还能被访问到即仍然可达垃圾回收机制就不会释放这块内存。结束使用该值之后有时会忘记取消引用导致内存无法释放进而可能会引发内存泄漏。WeakSet 里面的引用都不计入垃圾回收机制所以就不存在这个问题。因此WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。
由于上面这个特点WeakSet 的成员是不适合引用的,因为它会随时消失。另外,由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakSet 不可遍历。
@ -981,9 +981,9 @@ wm.set(element, 'some information');
wm.get(element) // "some information"
```
上面代码中,先新建一个 Weakmap 实例。然后,将一个 DOM 节点作为键名存入该实例,并将一些附加信息作为键值,一起存放在 WeakMap 里面。这时WeakMap 里面对`element`的引用就是弱引用,不会被计入垃圾回收机制。
上面代码中,先新建一个 WeakMap 实例。然后,将一个 DOM 节点作为键名存入该实例,并将一些附加信息作为键值,一起存放在 WeakMap 里面。这时WeakMap 里面对`element`的引用就是弱引用,不会被计入垃圾回收机制。
也就是说,上面的 DOM 节点对象的引用计数是`1`,而不是`2`。这时一旦消除对该节点的引用它占用的内存就会被垃圾回收机制释放。Weakmap 保存的这个键值对,也会自动消失。
也就是说,上面的 DOM 节点对象除了 WeakMap 的弱引用外,只有一处引用。这时一旦消除对该节点的引用它占用的内存就会被垃圾回收机制释放。WeakMap 保存的这个键值对,也会自动消失。
总之,`WeakMap`的专用场合就是,它的键所对应的对象,可能会在将来消失。`WeakMap`结构有助于防止内存泄漏。