编程技术文章分享与教程

网站首页 > 技术文章 正文

理解Map、WeakMap、Set、WeakSet区别

hmc789 2024-11-18 12:54:56 技术文章 2 ℃

一、Map与Object对比

a. 具体用法不同,Map是map.set()、map.get()、map.has()、map.delete(),Object可以直接obj.xx进行设置,in判断是否存在(有bug,可以拿到原型上的)等,Map的key可以重名(后者覆盖前者),Object的Key不可重名

b. Map可以用任意类型值作为key,Object必须用string、symbol作为key

c. Map是有序的,Object是无序的

d. Map可以使用size属性获取长度/大小,Object需要循环获取

e. Map可以使用for-of迭代,Object不可迭代(可以通过Object.values\keys方式进行迭代)

f. 增删改查,Map性能比Object好,底层对Map做了特殊处理

g. Map没有属性描述符等,故相比Object消耗的内存要少

f. Map(这点和Set特性一致)中,0、+0、-0为同一值,以及NaN,故只能存在其中一个,且引用数据类型作为Key时,如果引用地址一致,那么也只能保持一个,如:

h. 可以使用二维数组初始化一个map,如:

二、WeakMap与Map对比

a. WeakMap的key必须是对象,否则报错

b. WeakMap不可迭代,但可以使用map.set()、map.has()、map.delete()方法,但没有get方法

c. WeakMap是弱引用,垃圾回收时,如果手动清理引用,会造成WeakMap的数据丢失,但Map不会,如:

上图可知,当obj被GC回收后,Map将继续保持引用,但WeakMap却造成了数据丢失。

d. 不可使用二维数组初始化WeakMap

三、Set与Map对比

a. 方法不同,Set是set.add(),set.clear(),set.delete(),set.has(),也有size属性等

b. 0、+0、-0为同一值,以及NaN,故只能存在其中一个,且引用数据类型作为Key时,如果引用地址一致,那么也只能保持一个

c. 值是唯一存在的

d. 可以使用二维数组初始化Set,如:

e. Set也是使用for-of进行迭代

四、WeakSet与Set

基本上和WeakMap一致,但WeakSet没有get方法

Tags:

标签列表
最新留言