一、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()
【使用场景】
- 存储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集合为空
- 存储对象实例的私有数据
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
}())
// 只要对象被销毁相关信息也会被销毁