浅浅学一下Map,weakMap,Set,WeakSet

144 阅读3分钟

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)  // 输出空映射,如下图所示

image.png

使用场景

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) // 输出空集合,如下图所示

image.png

使用场景

给对象打标签

// 禁用按钮集合
const banSet = new WeakSet()
const button = document.querySelector('#button')
banSet.add(button)

如果按钮在当前集合,表示为禁用按钮;如果按钮从dom数中删除后,并且没有其他地方引用,则垃圾回收程序将自动释放其内存。

往期文章回顾

uniapp实现背景颜色跟随图片主题色变化(多端兼容)

一文学会请求中断、请求重发、请求排队、请求并发

table表格自适应浏览器窗口变化解决方案