凡人视角学习《ES6标准入门》-set和map数据结构

55 阅读2分钟

Set

基本用法

“set内部判断两个值是否相同时使用的算法与精确相等运算符(===)类似,主要区别是Set认为NaN等于自身。”

let set =new Set()
let a=NaN
let b=NaN
set.add(a)
set.add(b)
set//NaN

"两个对象总是不相等的"

let set=new Set()
set.add({})
set.size//1
set.add({})
set.size//2
//由于两个空对象不是精确相等,所以被视为两个值

遍历操作

4个遍历方法

  • keys();
  • values();
  • entries();
  • forEach();

遍历的应用

  • 数组去重
  • 实现并集,交集,差集
let a=new Set([1,2,3])
let b=new Set([4,3,2])

//并集
let union =new Set(...[a],...[b])
union//Set{1,2,3,4}

//交集
let intersect=new Set([...a].filter(x=>b.has(x)))
intersect//Set{2,3}

//差集
let difference=new Set([...a].filter(x=>!b.has(x)))
difference//Set{1}

WeakSet

含义

“WeakSet的成员只能是对象,不能是其他类型的值”

const ws=new WeakSet()
ws.add(1)
//TypeError:Invalid value used in weak set
ws.add(Symbol())
//TypeError:Invalid value used in weak set

"WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用。如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象是否还在WeakSet中"

语法

“没有遍历操作,没有size属性”
操作方法只有add(),delete(),has(),没有clear()

用途

“WeakSet的一个用处是储存DOM节点,而不用担心这些节点从文档移除时引发内存泄漏”

const foos=new WeakSet()
class Foo{
    constructor(){
        foos.add(this)
    }
    method(){
        if(!foos.has(this)){
            throw new TypeError('Foo.property.method只能在Foo实例上调用!')
        }
    }
}
//这里用WeakSet的好处是,数组对实例对象的引用 不会计入内存回收机制,当实例对象删除时,WeakSet不会导致内存泄漏

Map

含义与基本用法

“Map的键不限于字符串,各种类型的值(包括对象)都可以作为键”
一直在想有object为什么还用map,object只能用字符串作为键

const m =new Map()
const o ={p:'hello world'}
m.set(o,'content')
m.get(o)//'content'

“只有对同一个对象的引用,Map结构才将其视为同一个键”

const map =new Map()
map.set(['a'],555)
map.get(['a'])//undefined

"同样的值得两个实例在Map结构被视为两个键"

const map = new Map()
const k1 = ['a']
const k2 = ['a']
map.set(k1,'111').set(k2,'222')
map.get(k1)//'111'
map.get(k2)//'222'

WeakMap

含义

“WeakMap只接受对象作为键名,不接受其他类型的值作为键名”
“WeakMap的键名所指向的对象不计入垃圾回收机制”

语法

“没有遍历操作,没有size属性”
操作方法只有set(),get(),has(),delete(),没有clear()

用途

"以dom为节点作为键名,进一步说,注册监听事件的listener对象适合用WeakMap实现"

const listener=new WeakMap()
listener.set(element1,handler1)
listener.set(element2,handler2)
element1.addEventListener('click',listener.get(element1),false)
element2.addEventListener('click',listener.get(element2),false)
//监听函数放在WeakMap中,一旦DOM对象消失,与他绑定的监听函数也会自动消失