ES6中的set和map

由来

在ES6之前,js中能够作为集合的数据类型就是数组。数组是数值型的索引,通常创建队列和堆栈更为方便,但是当碰到其他类型的索引时,我们往往会使用对象,对象也可以看作键值对的集合。这就是早期的set和map.

ES5模拟

ES5 模拟set

判断某个属性是否存在if( obj.prop)

ES5 模拟map

根据键名寻找值 obj.key

ES5模拟缺陷

1、检测某个属性值是否存在,实际是检测是的他的boolean属性,而不是他是否真的存在。如果是0,就会有问题。
2 、对象的键会默认转换成字符串,带来一些隐患和不便。例如 obj[6] 和obj[‘6’]其实是一样的。

ES6 set

set是一种没有重复元素的列表,一般用来判断集合中有没有某个值,不太可能去一个一个访问。
重复 有序
set可以快速的追踪离散值,访问到数据。

api

创建方式:
let a = new Set()
可以接受所有可以迭代的对象作为参数,如 数组、set、map
添加:
a.add(0)
例如:a.add(5) 与a.add(‘5’) 添加了两次
a.add({})与a.add({}) 也是添加了两次
size 属性:
a.size
存在判断:
a.has(5)
移除
a.remove(5)
a.clear()
forEach迭代:
第一个参数:回调函数中,v,k均为set的值,参数与数组一致。
第二个参数:可以传this
转换成数组
set无法直接获取元素值,如果需要像数组一样获取元素,可以转数组
arr = […set] 创建副本,不会修改set

weak set

如果是对象存储在Set实例中,只要set中的引用存在,垃圾回收机制就不能释放该对象的内存空间,所以上边提到的set可以看作是强引用的set集合。
例如我的key已经没有被引用了,但是set中仍然存在这个key。这就容易造成内存泄漏。
但是我们有时候希望当其他的引用都不存在时,让Set集合的饮用随之消失。
为了解决这个问题,就有了weakset,他的构造函数不接受任何原始值,如果数组中包含了其他的值,会抛出错误。

api

创建: new WeakSet()
添加; add()
移除: delete()
判断: has()

set 与 weakset 的区别

1、weakset 的add delete has 参数都不能传原始值,只能传对象。
2、weakset 没有foreach for-of ,因为他不可以迭代
3、weakset 不暴露任何迭代器,所以无法通过程序本身来检测其中的内容。比如keys()、value()等都不可以用
4、不支持siz属性。

ES6 map

map集合则是被用来存一些频繁取用的数据。

api

创建: new Map()
为了确保在传入map之前数据类型不会被修改,如果有参数,只能是数组,并且元素为健值对数组。例如:new Map([[1,10][‘1’,100]])
添加; set(key,value)
获取: get(key)
移除: delete(key) claer()
判断: has(key)
size: . size属性
迭代: forEach

weak map

与set weak 一致,为了保证出发垃圾回收机制,防止内存泄漏,因此有了weak map
如果是对象存储在Map实例中,只要map中的引用存在,垃圾回收机制就不能释放该对象的内存空间,所以上边提到的map可以看作是强引用的map集合。
例如我的key已经没有被引用了,但是map中仍然存在这个key。这就容易造成内存泄漏。
但是我们有时候希望当其他的引用都不存在时,让map集合的饮用随之消失。
为了解决这个问题,就有了weakmap,他的构造函数不接受任何原始值,如果数组中包含了其他的值,会抛出错误。

api

创建 :new WeakMap()
添加 ;set(key,value)
获取 :get(key)
移除 :delete(key) ,没有枚举,所以不支持claer()
判断 :has(key)

map 与 weakmap 的区别

1、weakmap 的add delete has 参数都不能传原始值,只能传对象。
2、weakmap 没有foreach for-of ,因为他不可以迭代
3、weakmap 不暴露任何迭代器,所以无法通过程序本身来检测其中的内容。比如keys()、value()等都不可以用,由于这些函数无法使用,因此可以创建一个对象的私有属性。
4、不支持siz属性。**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值