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转换成数组,意味着可以间接使用map
和filter
了
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)
:true
和false
,代表是否存在某个键
delete(key)
:成功true
,失败false
clear()
:没有返回值
遍历方法(keys
,values
,entries
,forEach
)和Set
中的遍历一样,不一样的地方想想也知道,就不记录了
for (let [key, value] of map) { // 默认会使用entries方法
console.log(key, value);
}
转数组也使用...
,转换完成后也可以使用filter
和map
数组转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;
}
Map
转JSON
JSON.stringify(strMapToObj(strMap)); // 结合上面的方法
JSON.stringify([...map]); // 转换为数组JSON
JSON
转Map
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);
}
// ...