ES6之WeakSet和WeakMap

21 阅读1分钟

ES6之WeakSet和WeakMap

const set = new WeakSet();
let obj = {
    name: "why",
    age: 18
}
let obj2 = {
    name: "kobe",
    age: 30
}
set.add(obj)
set.add(obj2)
obj = null;
// obj2 = null;
console.log(set)

const map = new WeakMap();
map.set(obj2, 1)
obj2 = null;
console.log(map)

let lis=document.querySelectorAll("li");
for (const li of lis) {
    map.set(li,{
        id:li.innerHTML,
        name:`姓名${li.innerHTML}`
    })
}
lis[0].remove();
lis = null;
console.log(map)

WeakSet 和 WeakMap 都类似于 set 和 map ,只是在进行对象地址的垃圾回收时,如果只剩下 set 和 map ,这两种新的集合会忽视掉自身的对象地址,就会导致对象没有变量进行地址保存,对象的内存就会进行回收。也就是不会影响垃圾回收。
WeakSet 只能添加对象,WeakMap 的键只能是对象,同时它们还不能遍历以及和遍历类似的 for-of 和 forEach 。因为遍历会将对象存放到一个新的变量,对垃圾回收没有影响,所以遍历没有意义。
当 WeakMap 的键被回收的时候,后面映射关系的值找不到索引也被回收。所以将元素集合写在前面。
垃圾回收并不是立即回收的,在控制台调试时容易出现现场保留的情况,导致无法生效。