ES6读书简记·Set & Map

CY 2019年01月06日 655次浏览

Set

Set与大部分编程语言中的Set一样,成员的值都是唯一的。

基本用法

Set直接用new关键字就可以,使用add方法可以向Set结构中加入成员。

Set的参数可以接受一个数组,Iterable,甚至是一个类数组对象。

Set可以用来去重:

[...new Set(array)] // 数组去重
[...new Set('ababbc')].join('') // 字符串去重

Set中添加值得时候不会被转型,意味着数字5和字符串"5"是两个不同的值

Set判断值是否相等的时候和”===“非常类似,只是NaN可以等于NaN

两个对象总是不相等的,所以添加两个{},不会被去重。

Set实例的属性和方法

size:这是一个属性,不是一个方法,返回成员数量

操作方法

add(value):添加某个值,返回 Set 结构本身,意味着可以链式调用

delete(value):删除某个值,返回一个布尔值

has(value):返回一个布尔值

clear():清除所有成员,没有返回值

Array.from()可以将Set转换为数组

遍历操作

keys():返回键名遍历器,和values()没有区别

values():返回键值遍历器,和keys()没有区别

entries():返回键值对遍历器,结构[key, value]这是Map的一个成员

forEach():遍历成员,不解释,参数依次是键值键名集合本身

对于遍历操作,映射操作等操作,内部的回调总是会有第三个参数:集合本身

集合本身在很多时候特别有必要

forEach函数有第二个参数,表示this的环境

直接用for...of循环遍历 Set会默认调用values方法

遍历的一些应用

使用...运算符将Set转换成数组,意味着可以间接使用mapfilter

let union = new Set([...a, ...b]); // 并集
let intersect = new Set([...a].filter(x => b.has(x))); // 交集
let difference = new Set([...a].filter(x => !b.has(x))); // 差集

如果想要遍历的时候同步改变原来的Set,只能使用映射后的结果替换掉原来的Set变量

WeakSet

WeakSet用来存储一些弱引用,就是那些随时可能会消失的对象,用来临时存一下,辅助做一些操作,他不会长时间存储到内存中,所以使用WeakSet可以预防内存泄漏。

里面只能存储对象,不能存储一些永远不会变成空引用的简单值。

垃圾回收机制不会管某个对象是否还存在与WeakSet中,依然会回收掉。

WeakSet不能遍历,因为无法知道里面是否存储了一个已经被回收掉的对象。

构造和Set一样,只是构造的参数传入的数组中,不能有简单值,

他有三个方法:add(value)delete(value)has(value)

没有size属性,不能被遍历

Map

Map也与大部分的编程语言的Map特性一样,那些重复的特性就不在这里记录了。

因为Object不能用对象作为键(只能是基本数据类型),所以提供了Map

Map构造可以接受一个数组或者类数组,或者Iterator,并且数组中的每个成员都是一个双元素的数组([key, value]),key = arr[0], value = arr[1](伪代码);

如果将对象作为键的话,只有当两个对象是同一个内存地址的时候,才会当作是同一个键。

如果简单类型作为键,严格相等才会当作是同一个键,NaN除外,这就意味着数字5和字符串"5"不是同一个键。

size属性:成员数

set(key, value):可以链式调用

get(key):若key不存在,返回undefined

has(key)truefalse,代表是否存在某个键

delete(key):成功true,失败false

clear():没有返回值

遍历方法(keysvaluesentriesforEach)和Set中的遍历一样,不一样的地方想想也知道,就不记录了

for (let [key, value] of map) { // 默认会使用entries方法
  console.log(key, value);
}

转数组也使用...,转换完成后也可以使用filtermap

数组转Map:直接new一个Map,参数的结构上面有说

Map转对象:

function strMapToObj(strMap) {
  let obj = Object.create(null); // 创建新对象
  for (let [k,v] of strMap) {
    obj[k] = v;
  }
  return obj;
}

对象转Map

function objToStrMap(obj) {
  let strMap = new Map(); // 创建一个Map
  for (let k of Object.keys(obj)) {
    strMap.set(k, obj[k]);
  }
  return strMap;
}

MapJSON

JSON.stringify(strMapToObj(strMap)); // 结合上面的方法
JSON.stringify([...map]); // 转换为数组JSON

JSONMap

objToStrMap(JSON.parse(jsonStr)); // 结合上面的方法
new Map(JSON.parse(jsonStr)); // 数组JSON转换为Map

WeakMap

概念和WeakSet是一样的,只接受对象做键(null除外),键不计入垃圾回收,注意不是值。

它不能被遍历,没有size,无法clear,只有四个方法可用:get()set()has()delete()

WeakMap用来部署私有属性:

// ...
	constructor(counter, action) {
		_counter.set(this, counter);
		_action.set(this, action);
	}
// ...