let s = new Set(); [2,3,5,4,5,2,2].map(x => s.add(x)) for (let i of s) {console.log(i)}// 2 3 5 4 //Set函数可以接受一个数组作为参数,用来初始化。 var items = new Set([1,2,3,4,5,5,5,5]); console.log(items); // set object console.log(items.size); // 5 //向Set加入值的时候,不会发生类型转换,所以5和“5”是两个不同的值。 let set = new Set(); set.add({}) console.log(set.size);// 1 set.add({}) console.log(set.size);// 2 //上面代码表示,由于两个空对象不是精确相等,所以它们被视为两个值。
2.Set实例的属性 Set结构的实例有以下属性。Set.prototype.constructor:构造函数,默认就是Set函数。
Set.prototype.size:返回Set实例的成员总数。
let s = new Set(); s.add(1).add(2).add(2);// 注意2被加入了两次 console.log(s); console.log(s.size); // 2
3.Set实例的方法 分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。下面先介绍四个操作方法。
add(value):添加某个值,返回Set结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。
上面这些属性和方法的实例如下:
let s = new Set(); s.add(1).add(2).add(2); console.log(s.has(1));// true console.log(s.has(2)); // true console.log(s.has(3));// false s.delete(2); console.log(s.has(2));// false s.clear(); console.log(s.size);//0 //Array.from方法可以将Set结构转为数组: let items = new Set([1, 2, 3, 4, 5]); let array = Array.from(items); console.log(array);//[1, 2, 3, 4, 5]
4.遍历操作 Set结构的实例有四个遍历方法,可以用于遍历成员。keys():返回一个键名的遍历器
values():返回一个键值的遍历器
entries():返回一个键值对的遍历器
forEach():使用回调函数遍历每个成员
由于Set结构没有键名,只有键值(或者说键名和键值是同一个值),所以key方法和value方法的行为完全一致。
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"] } set.forEach(function(item){ console.log(item);// red green blue })
二、WeakSet WeakSet和Set一样都不存储重复的元素,但有一些不同点 。WeakSet的成员只能是对象,而不能是其他类型的值。
WeakSet结构有以下三个方法。
WeakSet.prototype.add(value):向WeakSet实例添加一个新成员。
WeakSet.prototype.delete(value):清除WeakSet实例的指定成员。
WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在
let ws = new WeakSet(); //console.log(ws.add(1));// TypeError: Invalid value used in weak set let obj = {}; let foo = {}; ws.add(window); ws.add(obj); console.log(ws); console.log(ws.has(window)); // true console.log(ws.has(foo)); // false ws.delete(window); console.log(ws.has(window)); // false //WeakSet没有size属性,没有办法遍历它的成员。 console.log(ws.size) // undefined console.log(ws.forEach); // undefined //ws.forEach(function(item){ console.log('WeakSet has ' + item)})// TypeError: undefined is not a function
三、Map结构的目的和基本用法 Map 是一个“超对象”,其 key 除了可以是 String 类型之外,还可以为其他类型(如:对象)他的方法和 Set 差不多:
size:返回成员总数。
set(key, value):设置一个键值对。
get(key):读取一个键。
has(key):返回一个布尔值,表示某个键是否在Map数据结构中。
delete(key):删除某个键。
clear():清除所有成员。