深入理解es6学习笔记(三)Set和Map

184 阅读2分钟

一、Set集合

Set类型是一种有序列表,非重复值,集合中不会对所存值进行强制类型转换。(例外是——0和+0在这里认为是相等的)

1.常用方法

add() has() delete() clear() forEach()
Set集合的forEach方法中,如需要在回调函数中使用this引用,将其作为第二个参数传入即可;也可使用箭头函数这样就无需传参this。
【访问Set最好将其转换为数组对象】

function eliminateDuplicates(items) {
    return [...new Set(items)] // 转换为数组
}
let numbers = [1,2,3,3,3,4,5],
noDuplicates = eliminateDuplicates(numbers)
console.log(noDuplicates) // [1,2,3,4,5]

2.Weak Set集合--只存储对象

使用new WeakSet构造函数来创建集合时,传入的参数必须要是一个【可迭代对象】,传入原始值会程序会抛出错误。
它保存的是对象值的弱引用,移除对象的原始引用后,该集合会被回收并释放相应内存。

let set = new WeakSet(),key = {}
set.add(key)
console.log(set.has(key))
// 移除对象key的最后一个强引用 Weak Set中的引用也自动移除
key = null
  • 在WeakSet实例中,add()传入非对象参数会报错,has()和delete()则会返回false
  • Weak Set集合不可迭代,不能用于for-of循环
  • Weak Set不暴露人格迭代器(例如keys() values())无法通过程序本身检测其内容
  • Weak Set不支持forEach()
  • Weak Set不支持size属性

二、Map集合

1.常用方法

has() delete() clear() has() get() set()

2.Weak Map集合

Weak Map集合中键名必须是一个对象,集合中保存的是这些对象的弱引用,如果在弱引用之外不存在其他的强引用,引擎的垃圾回收机制会自动回收这个对象,同时移除集合中的键值对。
只有集合的【键名】遵从这个规则,键名对应的值如果是个对象则保存的是对象的强引用,不会触发垃圾回收机制。
支持的方法has() delete() set()
【使用场景】

  1. 存储DOM元素。当DOM元素消失时可以自动销毁集合中的相关对象
let map = new WeakMap(),
element = document.querySelector(".element")
map.set(element,"Original")
let value = map.get(element)
console.log(value) // "Original"
 // 移除element元素
 element.parentNode.removeChild(element)
 element = null
 // 此时Weak Map集合为空
  1. 存储对象实例的私有数据
let Person = (function (){
    let privateData = new WeakMap()
    function Person(name) {
        privateData.set(this,{name:name})
    }
    Person.prototype.getName = function(){
        return privateData.get(this).name
    }
    return Person
}())
// 只要对象被销毁相关信息也会被销毁