做网站公司选择哪家好,装修报价单明细表完整 清单,深圳校园网站建设,jsp网站维护在垃圾回收中了解JavaScript 引擎在值“可达”和可能被使用时会将其保持在内存中
let john { name: John };
// 该对象能被访问#xff0c;john 是它的引用
// 覆盖引用
john null;
// 该对象将会被从内存中清除通常#xff0c;当对象、数组之类的数据结构在内…在垃圾回收中了解JavaScript 引擎在值“可达”和可能被使用时会将其保持在内存中
let john { name: John };
// 该对象能被访问john 是它的引用
// 覆盖引用
john null;
// 该对象将会被从内存中清除通常当对象、数组之类的数据结构在内存中时它们的子元素如对象的属性、数组的元素都被认为是可达的。
let john { name: John };
let array [ john ];
john null; // 覆盖引用
// 前面由 john 所引用的那个对象被存储在了 array 中
// 所以它不会被垃圾回收机制回收
// 我们可以通过 array[0] 获取到它
类似的如果我们使用对象作为常规 Map 的键那么当 Map 存在时该对象也将存在。它会占用内存并且不会被垃圾回收机制回收。
let john { name: John };
let map new Map();
map.set(john, ...);
john null; // 覆盖引用
// john 被存储在了 map 中
// 我们可以使用 map.keys() 来获取它
而WeakMap 在这方面有着根本上的不同。它不会阻止垃圾回收机制对作为键的对象key object的回收
WeakMap
WeakMap 和 Map 的第一个不同点就是WeakMap 的键必须是对象不能是原始值
let weakMap new WeakMap();
let obj {};
weakMap.set(obj, ok); // 正常工作以对象作为键
// 不能使用字符串作为键
weakMap.set(test, Whoops); // Error因为 test 不是一个对象
如果我们在 weakMap 中使用一个对象作为键并且没有其他对这个对象的引用 —— 该对象将会被从内存和map中自动清除。 let john { name: John };let weakMap new WeakMap();weakMap.set(john, ...);console.log(weakMap.get(john)); //...john null; // 覆盖引用// john 被从内存中删除了console.log(weakMap.get(john)); //undefined
WeakMap 不支持迭代以及 keys()values() 和 entries() 方法。所以没有办法获取 WeakMap 的所有键或值。
WeakMap 只有以下的方法
weakMap.get(key)weakMap.set(key, value)weakMap.delete(key)weakMap.has(key)
使用的场景
WeakMap 的主要应用场景是 额外数据的存储缓存
WeakSet
WeakSet 的表现类似
与 Set 类似但是我们只能向 WeakSet 添加对象而不能是原始值。对象只有在其它某个些地方能被访问的时候才能留在 WeakSet 中。跟 Set 一样WeakSet 支持 addhas 和 delete 方法但不支持 size 和 keys()并且不可迭代。
变“弱weak”的同时它也可以作为额外的存储空间。但并非针对任意数据而是针对“是/否”的事实。WeakSet 的元素可能代表着有关该对象的某些信息。
let visitedSet new WeakSet();let john { name: John };
let pete { name: Pete };
let mary { name: Mary };visitedSet.add(john); // John 访问了我们
visitedSet.add(pete); // 然后是 Pete
visitedSet.add(john); // John 再次访问// visitedSet 现在有两个用户了
// 检查 John 是否来访过
alert(visitedSet.has(john)); // true
// 检查 Mary 是否来访过
alert(visitedSet.has(mary)); // false
john null;
// visitedSet 将被自动清理(即自动清除其中已失效的值 john)
WeakMap 和 WeakSet 最明显的局限性就是不能迭代并且无法获取所有当前内容。那样可能会造成不便但是并不会阻止 WeakMap/WeakSet 完成其主要工作 —— 为在其它地方存储/管理的对象数据提供“额外”存储。
总结
WeakMap 是类似于 Map 的集合它仅允许对象作为键并且一旦通过其他方式无法访问这些对象垃圾回收便会将这些对象与其关联值一同删除。WeakSet 是类似于 Set 的集合它仅存储对象并且一旦通过其他方式无法访问这些对象垃圾回收便会将这些对象删除。
主要优点
是它们对对象是弱引用所以被它们引用的对象很容易地被垃圾收集器移除。
这是以不支持 clear、size、keys、values 等作为代价换来的……
WeakMap 和 WeakSet 被用作“主要”对象存储之外的“辅助”数据结构。一旦将对象从主存储器中删除如果该对象仅被用作 WeakMap 或 WeakSet 的键那么该对象将被自动清除。