Set 和Map

174 阅读3分钟

(Set 和Map)

Set和Map是ES6提出的两种新的数据结构。我们先从Set开始学习

Set

Set类似于数组,但是,它的成员必须是唯一的。没有重复的值。

新建一个set const set = new Set([1,2,3,4,5]); Set的构造器函数接收一个参数来生成set。那就是可迭代对象。只要部署了Iterator接口的类数组对象,都可以用来生成set;

Set的主要属性: Set的主要属性有两个:

size(用来获取Set的长度,类似于数组的length) constructor(指向构造器函数Set) Set的基础方法: Set作为一种新的数据结构,主要有下面四种方法:

add(value): 添加某个值,返回 Set 结构本身,类似于数组的push操作 delete(value)删除某个值,返回一个布尔值,表示删除是否成功。 has(value)返回一个布尔值,表示该值是否为Set的成员。 clear():清除所有成员,返回undefined。 Set的遍历方法: Set主要有下面几种遍历方法:

keys();返回一个键的遍历器。 values();返回键值的遍历器。 entries();返回一个带键值对的遍历器。 forEach。同数组的forEach行为一直。 注意点:

因为set是没有键的,所以,所有的键实际上都等于value。 因为set没有键,所以,你无法像数组一样直接去的其中某个值。。。。。类似于set[1].是取不到值的。 set的主要应用场景:

数组的去重 既然set不允许出现重复的元素,那么,我们可以这么实现数组的去重。

let arr = [1,3,56,88,88]; arr = [...new Set(arr)]; console.log(arr);

WeakSet weakSet 与Set类似,但是只能存放对象。也是不能有重复的值。

值得注意的是:两个对象之间是否属性值相等不能使用WeakSet判定。

例如:

const obj1 = { name: 1 } const obj2 = { name: 2 }

const wset = new WeakSet([obj1,obj2]);

这种情况下,还是会插入两个对象。因为,在js中,对象比较的是栈区的地址。两个对象栈区地址不一致,所以,js认为这两个对象不相等。如果想要判断两个对象是否属性值相等这种情况,还是需要使用类似深拷贝的思路去解决。

const obj1 = { name: 1 } const obj3 = obj1

const wset = new WeakSet([obj1,obj3]); 上述情况下,obj3不会被插入。

Map Map是ES6当中的新的数据类型,在过去,我们知道,对象总是以键值对的形式存在,我们的对象的键仅能使用字符串来充当。在ES6当中,我们可以使用map的结构,他的结构类似于对象,但是,允许键为任何数据类型。

const obj = { name: "小张" } const m = new Map(); m.set(obj, "描述对象") console.log(m);

得到了Map的庐山真面目 image

Map的构造器函数,还接受一个数组作为参数去新建一个Map对象。当然,这个数组的格式是有要求的。接收一个数组,该数组中的元素,必须也是一个数组,且长度为2.

代码如下:

const arr = [ [{name: "冯小刚"}, "著名导演"], [{name: "马化腾"}, "著名CEO"], [{name: "逢泽莉娜"}, "著名网红"] ]

const m = new Map(arr); console.log(m);