ES6新增数据类型之Set、WeakSet
分类:javascript
1、Set()
Set()
是ES6新增的一种集合类型,结构和Array
很像,只是它的方法和属性没有Array
丰富,但是有一点,它的成员是唯一的,没有重复的值
它的API和Map
很类似,只是用add()
替换了Map
的set()
,并且没有了 get()
方法
1.1 基本的API
1、创建一个Set
Set
本身是一个构造函数,用来生成 Set
数据结构
let set = new Set();
console.log(set); // {}
Set()
对象可以存储任意类型的值,但是用Set()
构造函数传入的参数只能是可迭代对象,如:数组、字符串
// 当你传入一个整数时,js会告诉你传入的参数1不是可迭代对象
let set = new Set(1);
console.log(set); // number 1 is not iterable
// 必须是数组或字符串,传入对象会报错
let set1 = new Set('1');
console.log(set1);
let set2 = new Set([1, 'true']);
console.log(set2);
2、常见的方法
方法 | 说明 | 示例 |
---|---|---|
has() |
判断是否有该值,返回布尔值 | set.has('name') |
add() |
向Set()添加元素,若有相同会覆盖 | set.add('name', 'zxc') |
delete() |
用于删除某个元素,成功则返回true ,失败返回false |
set.deldect('name') |
clear() |
用于清空 Set() 中所有的成员,没有返回值 |
set.clear() |
size 属性 |
判断 Set() 有多少个元素 |
set.size |
let set = new Set()
let arr = [1, 2]
set.add(1).add(arr)
set.add(function() { console.log(123); })
set.add({})
console.log(set); // { 1, [ 1, 2 ], [Function (anonymous)], {} }
// has() 判断元素
console.log(set.has(arr)); // true
// size 判断长度
console.log(set.size); // 4
// delete 删除
console.log(set.delete(1)); // true
// clear 清除
set.clear()
console.log(set); // {}
1.2 顺序与迭代
Set()
结构有四个遍历的方法
方法 | 说明 | 示例 |
---|---|---|
keys() |
返回键的遍历器 | set.keys() |
values() |
返回值的遍历器 | set.values() |
entries() |
返回所有成员的遍历器,包含键,值 | set.entries() |
forEach |
遍历Set 的所有成员 |
set.forEach(function(), [this]) |
由于Set结构没有键名,所以其键名和键值是一致的
let set = new Set(['张三', '李四', '王五', 'true']);
// 遍历键
console.log(set.keys()); // { '张三', '李四', '王五', 'true' }
// 遍历值
console.log(set.values()); // { '张三', '李四', '王五', 'true' }
// 返回键值
console.log(set.entries());
/* {
[ '张三', '张三' ],
[ '李四', '李四' ],
[ '王五', '王五' ],
[ 'true', 'true' ]
}*/
// forEach() 循环
let set = new Set(['张三', '李四', '王五', 'true'])
set.forEach(function(value, key) {
console.log(key + ':' + value);
})
/*
张三:张三
李四:李四
王五:王五
true:tru*/
也可以使用 for...of
或 for...in
// 遍历值
for (let value of set) { console.log(value);}
// 遍历键
for (let key in set) {console.log(key);}
1.3 Set() 类型转换
Set
类型可以与其它类型的值进行转换
Array
转换为Set
let arr = [1, 2, 3, 4]
let set = new Set(arr)
console.log(set); // { 1, 2, 3, 4 }
Set
转换为Array
:可以通过扩展运算符...
来实现
let set = new Set([1, 2, 3, 4])
console.log([...set]); // [ 1, 2, 3, 4 ]
String
转换为Set
let str = '张三'
let set = new Set(str)
console.log(set); // { '张', '三' }
1.4 Set
对象的作用
利用Set
不重复性可以用于数组的去重
// 将数组转换为Set,再将Set转换为数组
let arr = [1, 1, 4, 1, 2, 3, 1, 2]
let set = new Set(arr)
console.log([...set]); // [ 1, 4, 2, 3 ]
并集操作:将两个数组进行并集操作
let arr1 = [1, 1, 4, '1', 2, 3]
let arr2 = [5, 1, '2']
let set = new Set([...arr1, ...arr2])
console.log([...set]); // [ 1, 4, '1', 2, 3, 5, '2' ]
Set
不允许强制转换,1 和 ‘1’ 被认为是不同的值
总结:
Set()
最大的特点就是它的元素是唯一的,基于这个特性可以用于去重Set()
可以存储任意类型的值,但是初始化的时候只能传入可迭代对象Set()
可以与Array
进行互相转换,也可以把String
转换为Set
类型
2、WeakSet()
WeakSet
是一种 “若集合”类型,其集合中的值只能是对象
2.1 API
方法 | 说明 | 示例 |
---|---|---|
has() |
判断是否有该值,返回布尔值 | map.get('name') |
add() |
向Set()添加元素,若有相同会覆盖 | map.set('name', 'zxc') |
delete() |
用于删除某个元素,成功则返回true ,失败返回false |
map.deldect('name') |
1、创建一个空的WeakMap
let WeakSet = new WeakSet();
2、初始化WeakSet
构造函数可以传入一个迭代对象,可迭代对象中的值必须得是对象
let x = { id: 1 },
y = { id: 2 }
let weakSet = new WeakSet([x, y]);
console.log(weakSet);
console.log(weakSet.has(x)); // true
console.log(weakSet.delete(x)); // true
WeakSet
中没有clear
方法 和size
属性
因为
WeakSet
中的值任何时候都可能被销毁,所以没必要提供迭代的功能,也用不着先clear
这个清空的功能