Map,Set是ES6新增的两种数据结构,由于它们的特性,在开发中可以帮我们处理一些特殊情况,带来效率的提升
Set
Set最大的特性是它的元素唯一性,它本身可以存储任何类型的值。
//set常用api
let set = new Set();
set.add(1)
set.add(2)
set.add('str')
set.add([1,2,3])
set.add({x:1,y:2})
set.add((e)=>{console.log(e)})
set.delete(2)
console.log(set,set.size,set.has(1),set.values(),set.keys())

唯一性的体现:
let set = new Set();
set.add(1)
set.add(2)
set.add('str')
set.add([1,2,3])
set.add({x:1,y:2})
set.add((e)=>{console.log(e)})
set.delete(2)
set.add(1)
set.add({x:1,y:2})
console.log(set,set.size,set.has(1),set.values(),set.keys())

然后set有一个很常用的功能就是和数组之间的类型转换
let set = new Set(['v1','v2','v3']);
let setArr = [...set]
console.log(set,setArr)

其实看控制台打印发现,Set类似于一个对象,它本身也是一个引用类型
Map
Map是用来保存键值对的,从这一点来看,妥妥的对象特性,但Map和Object不相同的一点是,它的键值可以存储任何值
Map和Object的区别:
- Object的键只能是字符串或者Symbols,但Map的键可以是任意值
- Object键值无序,Map键值有序
- Object键值对个数无法查看,Map可查看
- Object有原型链,原型的键名可能会与对象上的键名冲突
example:
let map = new Map();
map.set('str-key','str-key对应的value')
map.set({x:1},'obj对应的value')
map.set((e)=>{console.log(e)},'func对应的value')
map.set(NaN,'NaN对应的value')
map.set(null,'null对应的value')
console.log(map.size,map.keys(),map.values(),map.entries())

也可以用forEach循环键值对:
map.forEach((value,key) => {
console.log(value + ' = ' + key)
})
或者用for…of循环
for(let [key,value] of map) {
console.log(key + ' = ' + value)
}

但是for…in循环没得用,这一点上,看得出来Map不是纯对象,至少不是可枚举属,还是有差异的
Map对象也是可以和数组之间进行类型转换,但是只能用二维数组
let map = new Map([['key1','value1'],['key2','value2']]);
let mapArr = Array.from(map)
for(let [key,value] of map) {
console.log(key + ' = ' + value)
}
console.log(mapArr)
