一文明白ES6新数据类型 Set
今天我们来学习ES6的新数据类型Set,简单来说Set像数组一样存储集合数据,但Set只会存储唯一不重复的数据。
文章目录
Set 简介
ES6提供了一种新的数据类型叫Set,来让我们存储一组具有唯一不重复的数据,创建Set,我们可以使用new
let setObject = new Set();Set构造函数接受一个Iterators object(可迭代对象),之后会把这些数据添加到Set中。
let setObject = new Set(iterableObject);一些有用的 Set 方法
Set给我们提供了一些有用的方法:
add(value)– 追加一个新的元素到Set中,返回Set对象,我们可以使用链式调用。clear()– 清空Set中的所有元素。delete(value)– 删除Set中的元素。entries()– 返回一个新的Iterator(可迭代对象)包含[value, value]。forEach(callback [, thisArg])– 像数组的forEach一样,并且每次调用会将this设置为thisArghas(value)– 判断Set中是否有该元素,返回true/falsekeys()– 和values()方法一样。[@@iterator]– 返回一个新的Iterator object(可迭代对象)。
一些 Set 例子
使用Set给数组去重
下面传入一个数组
let chars = new Set(['a', 'a', 'b', 'c', 'c']);因为Set会保证数据的唯一性,所以数组中的两个a和两个c只会留下一个
console.log(chars);
// 输出:
// Set(3) {'a', 'b', 'c'}使用typeof查看类型的话,会是object
console.log(typeof(chars));
// 输出:
// object使用instanceof来判断的话会是true
let result = chars instanceof Set;
console.log(result);
// 输出:
// true获取Set的长度
使用.size来获取Set的长度,这和数组length不同
let size = chars.size;
console.log(size);
// 输出:3向Set中添加元素
使用add()方法向Set中添加数据
chars.add('d');
console.log(chars);
// 输出:
// Set(4) {'a', 'b', 'c', 'd'}因为add方法会返回当前Set对象,我们也可以使用链式调用
chars.add('e')
.add('f');判断值是否在Set中
使用has()方法判断一个值是否在Set中,如果存在返回true,反之会是false。
let exist = chars.has('a');
console.log(exist);
// 输出:true下面会返回false,因为Set中并没有z
exist = chars.has('z');
console.log(exist);
// 输出:false删除Set中的元素
我们使用delete()方法来去删除Set中的某个元素,比如下面删除Set中的f,如果删除成功会返回true,反之为false。
chars.delete('f');
// 输出:true
console.log(chars);
// 输出:Set(5) {'a', 'b', 'c', 'd', 'e'}清空Set中的所有元素,使用clear()方法
chars.clear();
console.log(chars);
// 输出:Set(0) {}循环Set中的元素
Set对象保持我们插入元素时的顺序,假如我们插入下面的数据
let roles = new Set();
roles.add('1')
.add('3')
.add('2');下面使用for/of来循环Set
for (let role of roles) {
console.log(role);
}
// 输出:
// 1
// 3
// 2Set对象同样也提供keys()、values()、entries()方法,下面请看entries()方法,keys和values也差不多一样。
for (let [key, value] of roles.entries()) {
console.log(key, value);
console.log(key === value);
}
// 输出:
// 1 1
// true
// 3 3
// true
// 2 2
// true使用forEach循环Set
同样也可以使用forEach
roles.forEach(role => console.log(role));
// 输出:
// 1
// 3
// 2WeakSet
WeakSet和a Set 很像,只是它只包含对象。由于WeakSet中的对象可能被自动垃圾回收,所有WeakSet没有size属性,也不能迭代它,所以WeakSet在平时几乎很少使用到。可能只会用WeakSet来检查某个值是否集合中。
let bmw = {name: 'bmw'};
let benz = {name: 'benz'};
let cars = new WeakSet([bmw, benz]);
if (cars.has(benz)) {
console.log('我们有奔驰品牌的汽车');
}
// 输出:
// 我们有奔驰品牌的汽车好了,今天的内容到这里了,通过本文相信大家可以知道Set如何去使用。
