简单理解,Set是一种集合,Map是一种字典。
集合存储值是以[值, 值]的形式;
字典存储值是以[键, 值]的形式;
一、Map
看看MDN的定义:
Map对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。
定义一个Map集合:
const map = new Map();
const obj1 = {
name: 'zhangsan',
value: '12345'
}
const obj2 = {
age: 35,
gender: 'male'
}
map.set(obj1, obj2)
map.get(obj1) // { age: 35, gender: 'male' }Map和Object的比较
相似点: 都允许按、删除键、检测一个键是否绑定了值。之前都是把对象当Map使用。
不同点:
1. Map的键类型可以是任意值,一个Object的键必须是一个String或是Symbol。
2. 键的顺序: Map中的key是有序的,而Object的键是无序的。
注意:自ECMA2015规范后,对象保留了字符串和Symbol的创建顺序,因此在只有字符串键的对象上进行迭代将按插入顺序产生键。
3. Map键值对的个数可通过size获取,而Object只能手动计算。
4. 迭代: Map可以被直接迭代,Object需要某种方式获取键之后才能迭代
5. 性能: Map在频繁增删键值场景下表现更好,而Object并没对此做出优化。
Map的属性和方法
属性:
- size: 返回元素个数
方法:
- set(key, value): 添加新元素
- get(key): 通过键查找特定的数值并返回;
- has(kekey): 如果键存在,返回true,否则返回false;
- delete(key): 通过键删除对应数据
- clear(): 将字典中所有元素删除
遍历:
- keys(): 以数组形式返回所有键;
- values(): 以数组形式返回所有值;
- forEach(): 遍历所有成员
Set
Set集合的特点:
- 项是无序且唯一的。此特点经常用来做数组去重。
- Set本身是一个构造函数,用来生成Set数据结构
const set = new Set()
const arr = [1, 2, 3, 4, 4, 5, 3, 4]
arr.forEach(c => s.add(c))
for(let i of set) {
console.log(i) // 1 2 3 4 5
}
[...new Set(arr)]
Set的属性与方法
属性:
- size: 返回包含元素的数量
方法:
- add(value): 添加新项
- delete(value): 删除项
- has(value): 是否存在 ,返回布尔值
- clear(): 移除所有项
遍历:
- keys(): 返回包含所有键的数组
- values(): 返回一个包含所有值的数组
- entries(): 返回一个包含所有键值对的数组
- forEach(): 用于对集合成员进行某种操作,没返回值
用处:
求交集、并集、差集