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 的键被回收的时候,后面映射关系的值找不到索引也被回收。所以将元素集合写在前面。
垃圾回收并不是立即回收的,在控制台调试时容易出现现场保留的情况,导致无法生效。