一、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方法
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!