导言
ES6提供的了几个新的数据结构(集合)Set、Map、WeakSet 、WeakMap,下面我来分析一下它们的不同
Set集合
他类似于数组,但是他的成员的值具有唯一性,没有重复的值
- 特点
- 1.Set本身是一个构造函数,能够使用new关键字创建
- 2.Set数据类型里面的值具有唯一性
var set = new Set([1,2,3,2,1]);
console.log(set)//[1,2,3]
- 注意:Set集合只能接受可迭代的数据作为初始化数据(只有数组和字符串以及伪数组),对象不可以。
var li = document.getElementsByTagName("li");
var lis = new Set(li);
console.log(lis);//Set(8) {li, li, li, li, li, …}
var obj = {
name : "杨洋",
age : 16,
sex : "女"
}
var set = new Set(obj);
console.log(set);
- 应用:
- 数组去重:扩展运算符和 Set 结构相结合,就可以去除数组的重复成员。
var arr = [3, 5, 2, 2, 5, 5];
var unique = [...new Set(arr)];
console.log(unique);//[3,5,2]
- 属性和原型方法(实例方法)
- add() 添加重复的数据无效
- 注意:set在封装时,对+0和-0做了处理,使他们相等,其他的数据都是按照Object.is()来判断的
- has() 是否存在某个数据
- delete() 返回是否删除成功
- clear() 清空
- keys() 返回键名
- values() 返回键值
- size属性 数据个数,只读
- forEach
- 三个参数 item index s
- index不是下标,set集合中没有下标,
- index和item相同,都表示set中的每一项
- 遍历 for of
- add() 添加重复的数据无效
WeakSet
- 作用:使用该集合,可以实现和set一样的功能
- 与set不同
- 内部存储地址不会影响垃圾回收
- 只能添加对象
- 不能遍历,不是一个可迭代的对象,没有size属性,没有forEach方法
var wset = new WeakSet();
wset.add({"name" : "丽丽"});
wset.add(1);//报错
wset.add([1,2,3])
console.log(wset);
Map集合
类似于对象, 也是键值对的集合,但是键不仅限于字符串,各种类型都可以当做键,提供了**“值-值”**
- 作用: 用于存放键值对,其中键不能重复(map,映射,即原数组映射成一个新的数组)
- 属性和方法
- size 数据个数
- set() 传递的是键值对,两个参数,键是可以为任意类型的
- 键不存在,则添加
- 键存在,则修改
var arr = [1,2,3];
var obj = {
"name" : "丽丽",
"age" : 15
}
var map = new Map();
map.set(arr,"你好,数组");
console.log(map);//{Array(3) => "你好,数组"}
map.set(obj,"你好,对象");
console.log(map);//{Array(3) => "你好,数组", {…} => "你好,对象"}
- get() 根据一个键,获取键对应的属性
var map = new Map([
["name","李白"],
["age",30],
["type","诗人"],
["作品","静夜思"]
])
console.log(map);//Map(4) {"name" => "李白", "age" => 30, "type" => "诗人", "作品" => "静夜思"}
console.log(map.get("name"));//李白
- 其他方法和Set的方法一样
四、WeakMap
1、作用:与Map结构类似,也是用于生成键值对的集合,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。
2、与Map的区别
- 不接受基本类型的值作为键名
- 没有keys、values、entries(没有遍历操作)和size方法和属性
- 无法清空,即不支持clear方法。
3、WeakMap只有以下四个方法可用:
get()、set()、has()、delete()