z-memo / interview

我们缺的从来都不是前端/后端工程师,而是工程师(或者那些会系统思考,并总是想着解决问题的人)
27 stars 3 forks source link

介绍下 Set、Map、WeakSet 和 WeakMap 的区别? #3

Open MrSeaWave opened 3 years ago

MrSeaWave commented 3 years ago

http://es6.ruanyifeng.com/#docs/set-map

Set

  1. value不能重复
  2. 只有健值,没有健名,有点类似数组。
  3. 可以遍历,方法有add, delete,has

weakSet

  1. value都是对象
  2. 成员都是弱引用,随时可以消失。 可以用来保存DOM节点,不容易造成内存泄漏
  3. 不能遍历,方法有add, delete,has

Map

  1. 本质上是健值对的集合,类似集合,Map 对象的键可以是任何类型,但 WeakMap 对象中的键只能是对象引用
  2. 可以遍历,方法很多,可以干跟各种数据格式转换

weakMap

  1. 直接受对象作为键名(null除外),不接受其他类型的值作为键名
  2. 键名所指向的对象,不计入垃圾回收机制(key 是是弱引用,不计入 GC 的引用计数中,这意味着在没有其他引用存在时垃圾回收能正确进行
  3. 不能遍历,方法有get,set,has,delete
MrSeaWave commented 3 years ago

https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/464#issuecomment-815046719

MrSeaWave commented 3 years ago
MrSeaWave commented 2 years ago

WeakMap什么时候用?

https://www.zhangxinxu.com/wordpress/2021/08/js-weakmap-es6/

当我们需要在某个对象上临时存放数据的时候,请使用WeakMap。

(因为到时候只需要删除该对象,所有相关的引用和关联的内存都会被释放。

也就是,虽然我看不懂代码是怎么执行的,但是我这么写的,性能就是好,逼格就是高!)

https://juejin.cn/post/6993101968545677319#heading-30

  1. WeakMap的典型应用:以 DOM节点作为键名的场景 image

  2. WeakMap 可用来部署类中的私有属性 image