ES6 中 set 集合与 Map 集合

                                 Set 集合与Map集合

前言:长久以来,数组一直是javascript中唯一的集合类型,在es6之前,由于可选的集合类型有限,数组使用的又是数值类型索引,因而经常用于创建队列和栈。如果开发者要使用非数组类型索引,就会使用非数组对象创建所需要的数据结构,而这就是Set集合和Map集合。Set集合是一种无重复元素的列表。Map集合内含多组键值对,经常被用于缓存频繁取用的数据。

一、set集合

ECMAScript6中新增的set集合类型是一种有序列表,其中含有一些相互独立的非重复值,通过Set集合可以快速访问其中数据,更有效地追踪各种离散值。

1.创建Set集合并添加元素

调用new Set()创建Set集合,调用add方法向集合中添加元素,size属性可以获取集合中元素数量。

let set = new Set();
set.add(5);
set.add('5');

console.log(set.size) // 2

在set集合中,不会对所存值进行强制类型转换,数字5和字符“5”可以作为两个独立元素存在。

2.用数组来初始化Set集合

set构造函数同样会过滤重复值从而保证集合中元素各自唯一

let set = new Set([1, 2, 5, 2, 1, 6, 8, 10, 9, 10]);
console.log(set.size)  // 7

Set构造函数可以接受所有可迭代对象作为参数,数组、Set集合、Map集合都是可迭代的

3.通过has方法可以检测Set集合中是否存在某个值,返回布尔值

4.移除元素

调用delete()方法可以移除Set集合中某一个元素,调用clear()方法会移除集合中所有元素。

let set = new Set();

set.add(5);
set.add("5");

console.log(set.has(5)); // true

set.delete(5)

console.log(set.has(5)); // false

set.clear();
console.log(set.has("5"); // false
console.log(set.size) // 0

5.Set集合的forEach()方法

forEach()方法的回调函数接受以下3个参数:

set集合中下一次索引的位置

与第一个参数一样的值

被遍历的Set集合本身

let set = new Set([1, 2]);

set.forEach(function(value, key, ownSet){
    console.log(key + '--' + value);
    cosole.log(ownSet === set);
};

//输出

1--1
true
2--2
true

6.将set集合转换为数组

let set = new Set([1, 2, 3, 3, 3, 4, 5]);

let array = [...set];

console.log(array);   // [1, 2, 3, 4, 5]

二、Weak Set 集合

Weak Set 集合只存储对象的弱引用,并且不可以存储原始值。

集合中的弱引用如果是对象唯一的引用,则会被回收并释放相应内存

1.用WeakSet构造函数可以创建 Weak Set集合,集合支持3个方法:add()、has()、delete()。

let set = new WeakSet();
let key = {};

set.add(key);

console.log(set.has(key));  // true

set.delete(key);

console.log(set.has(key)); // false

注意:WeakSet 构造函数不接受任何原始值,如果数组中包含其他非对象值,程序会抛出错误。

2.WeakSet集合和 Set集合的区别

(1)、WeakSet的实例中,如果向add()方法传入非对象参数会导致程序报错,而向has()和delete()方法传入非对象参数会返回false

(2)、Weak Set 集合不可迭代,所以不能用于for-of 循环

(3)、Weak Set 集合不暴露任何迭代器,所以无法通过程序本身来检测其中的内容

(4)、Weak Set 集合不支持forEach()方法

(5)、Weak Set集合不支持size属性

如果你只需要跟踪对象引用,你更应该使用Weak Set集合而不是普通的Set集合

 

三、Map集合

Map类型是一种储存着许多键值对的有序列表,其中键名和对应的值支持所有的数据类型。Map属性名不会被强制类型转换。

1.如果向Map集合中添加新的元素,可以调用set()方法并分别传入键名和对应值作为两个参数,如果要从集合中获取信息,则可以调用get()方法

let map = new Map();

map.set('title', 'understanding ECMAScript 6“);

map.set("year", 2016);

console.log(map.get("title"));  // "understanding ECMAScript 6"
console.log(map.get("year"));   // 2016

2.Map集合支持的方法

has():检测指定键名在Map集合是是否存在

delete(): 从Map集合中移除指定键名及其对应的值

clear(): 移除Map集合中所有键值对

Map集合同样支持size属性,其代表当前集合中包含的键值对数量

3.Map集合的初始化方法

可以向Map构造函数传入数组来初始化一个Map集合,数组中每一个元素都是一个子数组,子数组中包含一个键值对的键名与值两个元素。

let map = new Map(["name", "nicholas"], ["age", 25]]);

console.log(map.size) // 2

3.Map集合的forEach()方法

接受3个参数:

下一次索引值

值对应的键名

Map集合本身

四、Weak Map集合

1.使用Weak Map 集合

列表的键名必须是非null类型的对象,键名对应的值则可以是任意类型。

2.支持的方法

1.has()方法

2.delete()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值