ES6新增了Set结构以及WeakSet结构,这节课就对这两种结构进行解析。
Set结构:
var s = new Set();
console.log(s);
//打印结果:Set {}
var s = new Set([1,2,3]);
console.log(s);
//打印结果:Set {1, 2, 3}
var s = new Set([1,2,3,1,2,3]);
console.log(s);
//打印结果:Set {1, 2, 3}
看出规律了吧,Set结构的成员值是没有重复的,每个值都是唯一的,重复的值会自动舍去。
现在说说 Set()的方法:add()、delete()、clear()、has()、entries()、keys()、values()、forEach()以及size属性:
add()是Set的添加元素方法,很明显,set结构会自动忽略相同的值,只会保留一个相同的值;
var s = new Set();
s.add(1);
s.add(1);
console.log(s);
//打印结果:Set {1}
delete()为set的删除元素方法,删除成功返回true,删除失败返回false,在没有此元素时候会返回删除失败。
//用数组作为参数初始化
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}
clear( )方法:清除所有成员:
//用数组作为参数初始化
var s = new Set([1,2,3]);
console.log(s);
//打印结果:Set {1, 2, 3}
s.clear();
console.log(s);
//打印结果:Set {}
has()方法:判断set结构中是否含有指定的值:
//用数组作为参数初始化
var s = new Set([1,2,3]);
s.has(1);//结果:true
s.has(4);//结果:false
entries( )方法:返回一个键值对的遍历器:
//用数组作为参数初始化
var s = new Set(['a','b','c']);
s.entries();
//结果:SetIterator {["a", "a"], ["b", "b"], ["c", "c"]}
注意得到的结果,成员值“a”对应的键值对是[“a”,”a”],也就是说:Set结构是键名和键值是同一个值。
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()方法来检验一下。从得到的结果可以看出:两者确实一致。
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的值是一样的。
WeakSet结构:
WeakSet结构同样不会存储重复的值,不同的是,它的成员必须是对象类型的值。(严格来说是:具有 iterable 接口的对象)
//初始化一个WeakSet对象
let ws = new WeakSet([{"age":18}]);
//结果:WeakSet {Object {age: 18}}
同样,WeakSet结构也提供了 add( ) 方法,delete( ) 方法,has( )方法给开发者使用,作用与用法跟Set结构完全一致。
另一个不同点是:WeakSet 结构不可遍历。因为它的成员都是对象的弱引用,随时被回收机制回收,成员消失。所以WeakSet 结构不会有keys( ),values( ),entries( ),forEach( )等方法和size属性。
公众号
网友评论