# 10.set和map数据结构

1.Set

Set类似于数组,但是成员的值都是唯一的。Set 本身是一个构造函数,用来生成 Set 数据结构。 以下是一种去除数组重复成员的方法。

console.log(new Set([1,2,3,4,3]))

向Set加入值的时候,不会发生类型转换,所以5和"5"是两个不同的值。需要注意的是在Set内部,两个NaN是相等,两个对象(无论是否为空)总是不相等的

2.Set实例的属性和方法

Set结构的实例有以下属性:constructor、sizesize等同于数组的length

Set实例的方法分为两大类:操作方法和遍历方法。

  • 操作方法:add(value)、delete(value)、has(value)、clear()
  • 遍历方法: keys()、values()、entries()、forEach(),其中forEach()可以写成箭头函数

Array.from方法可以将Set结构转为数组并去重

let setarray = array => {
  return Array.from(new Set(array))
}
setarray([2,2,3,3,4,4]) // [2,3,4]

3.Map

需要“键值对”的数据结构,MapObject更合适。 Map也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。 只有对同一个对象的引用,Map结构才将其视为同一个键。扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。

4.Map的实例属性和操作方法

  • 操作方法:size、set(key, value)、get(key)、has(key)、delete(key)、clear()set方法返回的是Map本身,因此可以采用链式写法,get方法读取key对应的键值,如果找不到key,返回undefined
let m = new Map().set('edition',6).set(262,'standard')
console.log(m.get(262))// standard
  • 遍历方法: keys()、values()、entries()、forEach(),Map的遍历顺序就是插入顺序。 新建map的方法如下:
let m = new Map().set('edition',6).set(262,'standard')
let n = new Map([
  ['F','no'],
  ['T','yes']
])

5.WeakMap

WeakMap结构与Map结构基本类似,唯一的区别是它只接受对象作为键名(null除外),不接受其他类型的值作为键名,而且键名所指向的对象,不计入垃圾回收机制。WeakMap结构有助于防止内存泄漏。 WeakMap与Map在API上的区别主要是:WeakMap只有四个方法可用get()、set()、has()、delete()

WeakMap应用的典型场合就是DOM节点作为键名。

WeakMap 的另一个用处是部署私有属性。

6.WeakSet 只能添加对象,不能是其他都值,没有遍历size clear