简述:
- Set 和 Map 主要的应用场景在于 数据重组 和 数据储存。
- Set 是一种叫做集合的数据结构,Map 是一种叫做字典的数据结构。
集合 与 字典 的区别:
- 共同点:集合、字典 可以储存不重复的值
- 不同点:集合 是以 [value, value]的形式储存元素,字典 是以 [key, value] 的形式储存
map与set的区别?
map
Map的key相比较普通对象来说更为灵活,普通对象的key只能以基础数据类型作为key值,并且所有传入的key值都会被转化成string类型,而Map的key可以是各种数据类型格式。
const map = new Map()
map.set({name:'xiaoli',age:10},'info')
map.has({name:'xiaoli',age:10}) // true
操作
操作方法:
- set(key, value):向字典中添加新元素。
- get(key):通过键查找特定的数值并返回。
- has(key):判断字典中是否存在键key。
- delete(key):通过键 key 从字典中移除对应的数据。
- clear():将这个字典中的所有元素删除。
通常将 map 转成数组以便于利用数组的方法(比如,filter,every等)进行操作,如下例子过滤map中vlaue小于18的键值。
let map = new Map([['Tom',22],['Jerry',20],['Ela',16]]);
map = new Map([...map].filter(item=>{
return item[1] > 18
}));
console.log(map)
输出结果为:
[...map]
操作将 map
转为二维数组,key
是 item[0] , value是item[1],打印[...map]
, 结果如图:
遍历
遍历方法:
- Keys():将字典中包含的所有键名以迭代器形式返回。
- values():将字典中包含的所有数值以迭代器形式返回。
- entries():返回所有成员的迭代器。
- forEach():遍历字典的所有成员。
let map = new Map([['Tom',22],['Jerry',20]]);
for (const key of map.keys()) {
console.log(key);//Tom Jerry
}
for (const value of map.values()) {
console.log(value);//22 20
}
for (const item of map) {
console.log(item);//["Tom", 22] ["Jerry", 20]
}
for (const item of map.entries()) {
console.log(item);//["Tom", 22] ["Jerry", 20]
}
map.forEach(item=>{
console.log(item)
})
set
set 的特点:
- Set可以讲讲它去重的特性。Set对象类似数组,且成员都是唯一的。
- 向 Set 加入值的时候,不会发生类型转换,所以5和"5"是两个不同的值。
- Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===)主要的区别是 NaN等于自身,而精确相等运算符认为NaN不等于自身。
let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}
let set1 = new Set()
set1.add(5)
set1.add('5')
console.log([...set1]) // [5, "5"]
使用Set成员唯一的特性进行,数组去重:
const arr = [1,2,3,4,4,5]
const set2 = new Set(arr)
console.log(set) // Set(5) {1, 2, 3, 4, 5}
const unqiueArr = [...set] //[1, 2, 3, 4, 5]
操作
- add(value):新增,相当于 array里的push。
- delete(value):存在即删除集合中value。
- has(value):判断集合中是否存在 value。
- clear():清空集合。
遍历
- keys():返回一个包含集合中所有键的迭代器。
- values():返回一个包含集合中所有值得迭代器。
- entries():返回一个包含Set对象中所有元素得键值对迭代器。
- forEach(callbackFn, thisArg):用于对集合成员执行callbackFn操作,如果提供了 thisArg 参数,回调中的this会是这个参数,没有返回值。
WeakMap 的特点
WeakMap只能以复杂数据类型作为key,并且key值是弱引用,对于垃圾回收更加友好。
- 键名必须是对象
- WeaMap对键名是弱引用的,键值是正常引用
- 垃圾回收不考虑WeaMap的键名,不会改变引用计数器,键在其他地方不被引用时即删除
- 因为WeakMap 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
- 也是因为弱引用,WeaMap 结构没有keys( ),values( ),entries( )等方法和 size 属性
- 当键的外部引用删除时,希望自动删除数据时使用 WeakMap
操作:
- add(value):在WeakSet 对象中添加一个元素value。
- has(value):判断 WeakSet 对象中是否包含value。
- delete(value):删除元素 value。