Map
Map(映射)是ES6新增的集合类型,用来存储“键/值对”数据,可以使用任意JavaScript数据类型作为键。和JavaScript中的Object比较相似。
Map方法
set(key, value): 添加键/值对。
get(key): 获取键的值
has(key): 判断是否存在该键
size(): 查询键/值对数量
detele(key): 删除指定的键/值对
clear(): 清除所有键/值对
引用类型作为key
// function作为key
const functionMap = new Map()
const function1 = function(){}
const function2 = function(){}
functionMap.set(function1, '方法1')
functionMap.set(function2, '方法2')
console.log(functionMap.get(function(){})) // undefined
console.log(functionMap.get(function1)) // 方法1
console.log(functionMap.get(function2)) // 方法2
// object作为key时
const objMap = new Map()
const you = {age: 18}
const me = {age: 18}
objMap.set(you, '你')
objMap.set(me, '我')
console.log(objMap.get({age: 18})) // undefined
console.log(objMap.get(you)) // 你
console.log(objMap.get(me)) // 我
判断key是否相同,类似于严格相等运算符(===)
console.log({} === {}) // false
console.log(function(){} === function(){}) // false
原始值作为key
const valueMap = new Map()
const a = 'key'
const b = 'key'
valueMap.set(a, 'a')
valueMap.set(b, 'b')
console.log(valueMap.get('key')) // b
console.log(valueMap.get(a)) // b
console.log(valueMap.get(b)) // b
使用场景
当保存的数据量比较大(分配相同内存的情况下,Map比Object能多存储50%的键/值对)或者Object无法满足需求时使用Map。
WeakMap
WeakMap(弱映射)是Map的兄弟类型,相关方法继承自Map,WeakMap中没有clear()方法。其中的键只能是Object引用类型,不能设置为原始值类型。 其中的“weak”与垃圾回收机制有关,当映射中键没有其他地方引用时,将会被垃圾回收机制自动回收。
垃圾回收
let val = 'a'
const weakMap = new WeakMap()
weakMap.set({}, '无其他引用对象') // 执行后自动被当作垃圾回收
let vv = {a: 1}
weakMap.set(vv, '我是vv')
vv = null //手动触发作垃圾回收
console.log(weakMap) // 输出空映射,如下图所示
使用场景
dom节点元数据
const wm = new WeakMap()
const box = document.querySelector('#box')
wm.set(box, { color: 'red' })
当box从dom树中销毁后,且没有其他地方引用box时,垃圾回收程序将自动释放其内存。
Set
Set是一种集合数据类型,用来存储值的集合,和JavaScript中的Array比较相似。
方法/属性
add(): 添加值。
has(value): 判断是否存在该值
size: 查询数量,类似于数组的.length
detele(value): 删除指定的值
clear(): 清除所有值
自动去重
原始值类型去重
const s = new Set()
s.add(1)
s.add(1)
console.log(s.size) // 1
引用类型去重
const s2 = new Set()
const a = {a: 1}
const b = a
s2.add(a)
s2.add(b)
console.log(s2.size) // 1
Set和Array相互转换
const arr = [2]
const ss = new Set(arr)
console.log(ss) // Set(1) {2}
console.log([...ss]) // [2]
使用场景
数组去重
const arr = ['a', 1, 'b', 'a', 1]
console.log([...new Set(arr)]) // ['a', 1, 'b']
WeakSet
弱集合数据类型,与weakMap的“弱”一样,都是与垃圾回收机制相关。当前集合中的值没有其他地方引用时,垃圾回收机制将自动回收集合中的值。
垃圾回收
const ws = new WeakSet()
ws.add({}) // 执行后自动被当作垃圾回收
console.log(ws) // 输出空集合
let ww = {a: 1}
ws.add(ww)
ww = null //手动触发作垃圾回收
console.log(ws) // 输出空集合,如下图所示
使用场景
给对象打标签
// 禁用按钮集合
const banSet = new WeakSet()
const button = document.querySelector('#button')
banSet.add(button)
如果按钮在当前集合,表示为禁用按钮;如果按钮从dom数中删除后,并且没有其他地方引用,则垃圾回收程序将自动释放其内存。