es新增数据结构set 与map
1.set
它类似于数组,但是成员的值都是唯一的,没有重复的值。
设置:set属性构造函数需要用new生成
New Set()
Set(array)
操作:
add(value) 增加
delete(value) 删除
has(value) 查看
clear() 清空
size 查看长度
set集合特点
1. 内容不可以重复
2. 写入集合中的数据不会自动转换类型
3. 在set中相同的对象不相等
4. 在set NaN是相等的
let n1 = Number('a1'); --->NaN
let n2 = Number('123a');--->NaN
比较时结果为false
console.log(n1 == n2); false
但是在set中会把NaN看为相等值
myset.add(n1);
myset.add(n2);
只能存储一个NaN
2.Weakset
与set类似,区别在于值只能存储对象
方法:
add()
delete()
has()
weakset不可遍历,多用于储存DOM对象
3.map
与对象类似,由键值对的方式组成
方法:
set( ) 添加 == set.add()
get( ) 获取
size( ) 长度
delete( ) 删除
clear( ) 清空
Map中传入二维数组时会自动遍历
4.WeakMap
里面的值,也只能是对象
方法: set() clear()
不可遍历
set和map的区别
1.map中的元素是key-value(键值对)对:关键字起到索引的作用,值则表示与索引相关联的数据;Set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字。
2.set的迭代器是const的,不允许修改元素的值;map允许修改value,但不允许修改key。
其原因是因为map和set是根据关键字排序来保证其有序性的,如果允许修改key的话,那么首先需要删除该键,然后调节平衡,再插入修改后的键值,调节平衡,如此一来,严重破坏了map和set的结构,导致iterator失效,不知道应该指向改变前的位置,还是指向改变后的位置。所以STL中将set的迭代器设置成const,不允许修改迭代器的值;而map的迭代器则不允许修改key值,允许修改value值。
3.map支持下标操作,set不支持下标操作。map可以用key做下标,map的下标运算符[ ]将关键码作为下标去执行查找,如果关键码不存在,则插入一个具有该关键码和mapped_type类型默认值的元素至map中,因此下标运算符[ ]在map应用中需要慎用,const_map不能用,只希望确定某一个关键值是否存在而不希望插入元素时也不应该使用,mapped_type类型没有默认值也不应该使用。如果find能解决需要,尽可能用find。