ES6新增的 Set 和 WeakSet (2018-05-29)
Set结构
Set是ES6给开发者带来的一种新的数据结构,你可以理解为值的集合。我们平时见到的数组Array也是一种数据结构,但是Set跟其他数据结构不同的地方就在于:它的值不会有重复项。
基本用法
//1、创建出一个Set结构 var s = new Set(); console.log(s); //打印结果:Set {}//2、创建含内容的Set结构 var s = new Set([1,2,3]); console.log(s); //打印结果:Set {1, 2, 3}//3、创建出一个Set结构 var s = new Set(); //使用add方法添加成员 s.add(1); s.add(2); s.add(3); console.log(s); //打印结果:Set {1, 2, 3}
成员值唯一
var s = new Set(); s.add(1); s.add(1); console.log(s); //打印结果: Set {1}
size属性
获取成员的个数。
let s = new Set([1,2,3,4]); s.size; //结果:4
delete( )方法
用户删除Set结构中的指定值,删除成功返回:true,删除失败返回:fasle。
//用数组作为参数初始化 var s = new Set([1,2,3]); console.log(s); //打印结果:Set {1, 2, 3} //使用delete方法删除指定值 s.delete(2);//结果:true s.delete(4);//结果:false console.log(s); //打印结果:Set {1, 3}
我们使用delete( )方法删除了指定值:2,结果返回true。删除指定值:4的时候,返回false,原因是变量s中找不到数字4。
clear( )方法
clear( )方法:清除所有成员。
//用数组作为参数初始化 var s = new Set([1,2,3]); console.log(s); //打印结果:Set {1, 2, 3} s.clear(); console.log(s); //打印结果:Set {}
has( )方法
判断set结构中是否含有指定的值。如果有,返回true;如果没有,返回fasle。
//用数组作为参数初始化 var s = new Set([1,2,3]); s.has(1);//结果:true s.has(4);//结果:false
当判断变量s中是否含有数字1时,得到的结果是true,判断是否含有数字4的时候,得到的结果是false。
entries( )方法
entries( )方法:返回一个键值对的遍历器。
//用数组作为参数初始化 var s = new Set(['a','b','c']); s.entries(); //结果:SetIterator {["a", "a"], ["b", "b"], ["c", "c"]}
注意得到的结果,成员值“a”对应的键值对是[“a”,”a”],也就是说:Set结构是键名和键值是同一个值。
keys( ) 和 values( ) 方法
keys( )方法:返回键名的遍历器。
values( )方法:返回键值的遍历器。
//用数组作为参数初始化 var s = new Set(['a','b','c']); s.keys(); //结果:SetIterator {"a", "b", "c"} s.values(); //结果:SetIterator {"a", "b", "c"}
上面entries()方法的使用告诉我们,Set结构的键名和键值是同一个值,那么我们就用Set结构提供的keys( )和values()方法来检验一下。从得到的结果可以看出:两者确实一致。
//用数组作为参数初始化 var s = new Set(['a','b','c']); //用for...of遍历 for(let [i,v] of s.entries()){ console.log(i+' '+v); } //打印结果:a a // b b // c c
forEach( )方法
forEach( )方法:遍历每一个成员。
//用数组作为参数初始化 var s = new Set(['a','b','c']); //使用回调函数遍历每个成员 s.forEach(function(value,key){ console.log(value,key) }); //打印结果:a a // b b // c c
使用方式跟数组的forEach一样。当然,得到的value是key的值是一样的。
Set的用途之一
再也不用怕数组去重问题鸟
//目标数组arr,要求去重 let arr = [1,2,2,3,4,4,4]; let s = new Set(arr); //结果:Set {1,2,3,4} let newArr = Array.from(s); //结果:[1,2,3,4],完成去重
WeakSet结构
Set和WeakSet两者名字就很像,WeakSet结构同样不会存储重复的值,不同的是,它的成员必须是对象类型的值。
//初始化一个WeakSet对象 let ws = new WeakSet([{"age":18}]); //结果:WeakSet {Object {age: 18}}
初始化一个WeakSet对象,参数一个数组,数组的成员必须是对象类型的值{"age":18},否则就会报错。
//初始化一个WeakSet对象 let ws = new WeakSet([1,2]); //结果:报错
以上的写法就会报错,因为数组的元素不是对象类型的,是数字1,2。
let arr1 = [1]; let arr2 = [2]; //初始化一个WeakSet对象,参数是数组类型 let ws = new WeakSet([arr1,arr2]); //结果:WeakSet {Object {age: 18}}
WeakSet结构也提供了add( ) 方法,delete( ) 方法,has( )方法给开发者使用,作用与用法跟Set结构完全一致。
WeakSet 结构不可遍历。因为它的成员都是对象的弱引用,随时被回收机制回收,成员消失。所以WeakSet 结构不会有keys( ),values( ),entries( ),forEach( )等方法和size属性。
作者:a小磊_
链接:https://www.jianshu.com/p/6fbf740221b7
共同学习,写下你的评论
评论加载中...
作者其他优质文章