Set
1、Set简述
Set本身提供构造函数(需要使用new创建Set数据结构)用来存储唯一值
const set = new Set()
同时可以接受一个数组作为参数创建Set
let array = [1,2,5,6]
const set = new Set(array)
console.log(set)
//结果:Set(4) {1, 2, 5, 6}
2、实例对象API
add(value):向Set中添加一条数据,比在数组中通过unshift(),push()要快,返回Set数据结构
has(value):判断Set中是否包含某一个元素,返回Boolean,牵扯到时间复杂度,比在数组中通过indexOf以及includes查找要快
set.has(value) //O(1)
array.indexOf(value) //O(n)
array.includes(value) //O(n)
delete(value):通过值从Set中删除一个元素,并且不需要下表索引。相当于数组中基于下表索引的splice()方法
方法返回Boolean类型,表明是否删除成功
clear():清除Set中的值,不需要任何参数
3、Set遍历方法
| 方法/属性 | 功能介绍 |
|---|---|
| keys() | 返回Set对象键名的遍历器 |
| values() | 返回Set对象键值的遍历器 |
| entries() | 返回Set对象键值对的遍历器 |
4、WeakSet
关于这个我没有用过,只是大概了解过
WeakSet类似于Set,值不允许重复,但是成员只能是弱引用的对象,弱引用对象会被垃圾回收机制回收掉,
可以用来保存DOM节点?
包含和Set同样的除clear()除外的另外三个方法,无法进行遍历,没有size
最后总结
Set类似数组,值不允许重复
可以存储任何类型值
不支持自动转换,5和'5'是不一样的
可以存储null和undefined
有可能两个null都不一样
Map
1、Map简述
Map对象保存键值对
Map本身是一个构造函数(需要new创建),用来生成Map数据结构
Map对象允许你储存任何类型的作为一个键或一个值
map可以通过new初始化
const map = new Map()
同时也可以通过向Map中传入数组完成初始化
const map = new Map([['name','Alliances'],['city','YC']])
console.log(map)
VM540:2 Map(2) {'name' => 'Alliances', 'city' => 'YC'}
另外也可以通过把对象当做键传入值
let obj = {
'desc':'懒懒散散的程序员'
}
map.set(obj,'他说的对')
console.log(map)
//Map(3) {'name' => 'Alliances', 'city' => 'YC', {…} => '他说的对'}
console.log(map.get(obj))
//他说的对
2、实例对象API
set(key,value): 向Map中插入键值对,返回整个Map
console.log(map.set('age','18'))
//Map(4) {'name' => 'Alliances', 'city' => 'YC', {…} => '他说的对', 'age' => '18'}
get(key): 返回数据,通过键得到值
console.log(map.get(obj)) //他说的对
has(key):查找key对应的值是否存在,返回Boolean表明是否存在
console.log(map.get('gender'))
//undefined
delete(key): 通过key删除键值对,返回Boolean用来判断是否成功
console.log(map.delete('ciy'))
//false
console.log(map.delete('city'))
//true
clear():清空Map,没有参数,没有返回值
3、遍历
keys() 返回一个包含Map中所有键的遍历器对象
for(let j of map.keys()){
console.log(j)
}
//name
//{desc: '懒懒散散的程序员'}
//age
values() 返回一个包含Map中所有值得遍历器对象
for(let k of map.values()){
console.log(k)
}
//Alliances
//他说的对
//18
entries() 返回一个包含Map中所有键值对的遍历器对象
for(let e of map.entries()){
console.log(e)
}
//['name', 'Alliances']
//[{…}, '他说的对']
//['age', '18']
forEach
map.forEach((value,key,map)=>{
console.log(key,value,map)
})
//name Alliances Map(3) {'name' => 'Alliances', {…} => '他说的对', 'age' => '18'}
//{desc: '懒懒散散的程序员'} '他说的对' Map(3) {'name' => 'Alliances', {…} => '他说的对', 'age' => '18'}
//age 18 Map(3) {'name' => 'Alliances', {…} => '他说的对', 'age' => '18'}
4、总结
支持所有数据类型做为键 本质上是键值对的集合 NaN和undefined都可以被存
Map和Set的区别
1、Map采用键值对(key,value)来存储元素,而Set采用和数组类似的方式存储数组,这是两者本质上的区别
2、Set不允许重复的值,而Map依靠于(key,value)形式,所以不允许重复的key,value可以重复
3、Map键值分离,值不作为键
...想到再更新...
Map和Object的区别
1、Map继承于Object
2、Object的属性的key只能是简单数据类型(字符串,整数,Symbol),而Map的key可以是任何类型
3、Map在存储大量元素的时候性能要比Object好,写入删除操作频繁情况下应该使用Map
4、Map插入元素有FIFO(First In, First Out),Object不存在