参考文献: 阮一峰教程
Set
- 基本用法
- 类似于数组,但是成员的值是唯一的,没有重复的值。
- var s = new Set()
- Set内部判断两个值是否不同使用的算法类似于精确相等运算符('===')。这意味着两个对象总是不相等的。唯一的例外是NaN等于自身('==='认为NaN不等于自身)
- 实例的属性
- Set.prototype.constructor: 构造函数,默认是Set函数
- Set.prototype.size: 返回Set实例成员的个数
- 实例的操作方法
- add(): 添加某个值,返回Set解构本身
- delete(): 删除某个值,返回一个布尔值,表示是否删除成功
- has(): 返回一个布尔值,表示参数是否是Set结构的成员
- clear: 清空所有成员,没有返回值
- 实例的遍历方法
- keys()
- values() // Set结构的键名和键值是同一个值
- entries()
- forEach()
- 总结
- 如果想在遍历操作中同步改变原来的Set结构,目前没有直接的方法,只有两种变通的方法。
// 方法一
let set = new Set([1,2,4])
set = new Set([...set].map(item => item * 2))
// 方法二
let set = new Set([1,2,4])
set = new Set(Array.from(set, x => x * 2))
复制代码
WeakSet
- 基本用法
- WeakSet结构和Set类似,也是不重复的值的集合。但是,它与Set有两个区别
- WeakSet的成员只能是对象
- WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用。也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象是否还在存在于WeakSet结构中。
- var ws = new WeakSet()
- 实例方法
- WeakSet.prototype.add()
- WeakSet.prototype.delete()
- WeakSet.prototype.has()
Map
- 基本用法
- 类似于对象,也是键值对的集合,但是 '键' 的范围不限于字符串 (普通对象只能用字符串做key值),各种类型的值(包括对象)都可以作为key。
- 可以接受一个数组为参数,并且该数组的成员是一个个表示键值的数组
new Map([['name', 'alex.cheng'], ['age', 24]])
- 获取一个未知的key,返回 undefined
- Map的键实际上是跟内存地址绑定的,只要内存地址不同,就视为两个键
- 0 和 -0,NaN 和 NaN 表示同一个键
- 实例的属性和方法
- Map.prototype.size
- Map.prototype.constructor
- set(key, value)
- get(key)
- has(key)
- delete(key)
- clear()
- 遍历方法
- keys()
- values()
- entries()
- forEach()
- 总结
- Map本身没有map和filter方法,结合数组的方法,实现过滤
let map1= new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c')
let map2 = new Map([...map1].filter(([key, value]) => k < 3))
// filter(([key, value) => {}) [key, value] 这里是解构赋值
复制代码
WeakMap
- 基本使用
- WeakMap 结构与 Map 结构基本类似,唯一的区别是它只接受对象作为键名(null除外),不接受其他类型的值作为键名,而且键名所指向的对象不计入垃圾回收机制
- 有助于防止内存泄漏