WeakMapECMAScript 6中引入的数据结构的实际用途是什么?
由于弱映射的键会创建对其相应值的强引用,因此只要其键仍处于活动状态,确保插入到弱映射中的值永远不会消失,它不能用于备注表,缓存或您通常使用弱引用的任何其他内容,具有弱值的映射等.
在我看来,这个:
weakmap.set(key, value);
Run Code Online (Sandbox Code Playgroud)
......这只是一种迂回的说法:
key.value = value;
Run Code Online (Sandbox Code Playgroud)
我错过了哪些具体的用例?
这是我注意到的奇怪之处.下面的代码不应该像WeakSet使用的那样将内存浪费掉,显然没有其他引用留在下面:
'use strict';
require('babel-polyfill');
const s = new WeakSet();
for (let i = 0 ; ; i++) {
s.add({});
if (i % 100000 === 0)
console.log(`${i} :${process.memoryUsage().heapUsed}`);
}
Run Code Online (Sandbox Code Playgroud)
(SCCE github repo here).
然而,打破它所做的记忆(Node v4.3.2与Babel转换):
<--- Last few GCs --->
165 ms: Scavenge 13.6 (48.0) -> 13.6 (48.0) MB, 14.4 / 0 ms [allocation failure].
189 ms: Scavenge 14.4 (48.0) -> 14.4 (52.0) MB, 17.6 / 0 ms [allocation failure].
340 ms: Scavenge 37.5 …Run Code Online (Sandbox Code Playgroud) 关于地图和弱地图已经存在一些问题,例如:ES6 Map和WeakMap有什么区别?但我想问一下,在哪种情况下我应该赞成使用这些数据结构?或者当我偏爱其他人时,我应该考虑什么呢?
来自以下网址的数据结构示例:https://github.com/lukehoban/es6features
// Sets
var s = new Set();
s.add("hello").add("goodbye").add("hello");
s.size === 2;
s.has("hello") === true;
// Maps
var m = new Map();
m.set("hello", 42);
m.set(s, 34);
m.get(s) == 34;
// Weak Maps
var wm = new WeakMap();
wm.set(s, { extra: 42 });
wm.size === undefined
// Weak Sets
var ws = new WeakSet();
ws.add({ data: 42 });
// Because the added object has no other references, it will not be held …Run Code Online (Sandbox Code Playgroud)