Map大家都很熟悉,是JS的对象,本质上是键值的集合(Hash结构),但是传统上只能用字符串当作键;至于Set,这是ES6提供的新的数据结构,他类似于数组,但是他的成员值都是唯一的,没有重复的值,本质是一个构造函数
Set
Set可以接受一个数组(或者具有iterable接口的其他数据结构)作为参数,用来初始化。还可以通过add方法进行添加数据
// 例一
const set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]
// 例二
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size // 5
// 例三
const set = new Set(document.querySelectorAll('div'));
set.size // 56
// 类似于
const set = new Set();
document
.querySelectorAll('div')
.forEach(div => set.add(div));
set.size // 56
这里衍生了一个去除数组重复数据的方法,同样适用于去除字符串:
[...new Set(array)]----------去除数组的重复成员
[...new Set('ababbc')].join('')
在Set中不会发生类型转换
实例的属性和方法
Set总共有两类属性两类方法,一个是她的构造属性一个是她的成员个数属性,分别为Set.prototype.constructor和Set.prototype.size。从数组来看,方法分为操作和遍历两部分,Set同理。分为操作数据和遍历数据
操作数据:总共有四种方法,分别为增、删、is判断,清除
- Set.prototype.add(value):增,返回Set
- Set.prototype.delete(value):删,返回布尔值,表示成功与否
- Set.prototype.has(value):是否组内值判断,返回布尔值,表示是否
- Set.prototype.clear():清除,不返回状态
遍历方法:也有四种,分别为遍历键名,遍历键值,遍历键值对,遍历每个成员
- Set.prototype.keys():遍历键名,通俗的讲就是属性
- Set.prototype.values():遍历键值,只有值
- Set.prototype.entries():遍历键值对,同时返回属性和值
- Set.prototype.forEach():遍历每个成员,
let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.values()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
Map
ES6中的Map对象相较于传统的map做了扩展,其中键的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
实例的属性和方法
Map同样具有他的个数属性size,同时具有set()、get()、has()、delete()、clear()方法。遍历方法同上。
与其他数据结构互相转换
Map可以数组、对象、JSON等数据结构进行互换
总结
- map解决了键只能是字符串的限制
- set解决了数组中没有重复值的问题