Map Set WeakMap WeakSet WeakRefs

WeakRefs 能创建一个弱引用 `new WeakRef(image)` ,当 image 被回收时值(`deref()`)变为 undefined
// 相当于不用任何参数能从长度为 1 的 WeakSet 中取出这个值
// 可以做基于原始值键的 WeakMap, FinalizationGroup 能在回收时执行回调

Weak 是指弱引用,不能遍历,因为弱引用遍历的结果受垃圾回收影响 // 里面的对象没有其他引用将可能被垃回收
Weak… 的键只能是对象值,不可以是原始值(原始值不是引用而是复制)
Map Set 是根据键来保存对象的集合,遍历时会根据放入的顺序。

Map对象就是简单的键/值映射(不是赋值).其中键和值可以是任意值(原始值或对象值).

键的比较是基于 "SameValueZero" 算法:NaN 是与 NaN 相等的(虽然 NaN !== NaN),剩下所有其它的值是根据 === 运算符的结果判断是否相等。在目前的ECMAScript规范中,-0和+0被认为是相等的,尽管这在早期的草案中并不是这样。有关详细信息,请参阅浏览器兼容性 表中的"Value equality for -0 and 0"。

使用map构造函数:m = new Map([[1,2],[3,4]])

var myMap = new Map();
keyString = "a string";
myMap.set(keyString, "和键'a string'关联的值");
myMap.get("a string"); // "和键'a string'关联的值"
var getObjectId = (function(id, map) {
return function(obj) {
return map.get(obj) || (map.set(obj, ++id), id)
}
}(0, new WeakMap));//返回对象作为键对应的值
相同对象不全等于,相同函数不全等于
与对象区别:
  • 一个对象通常都有自己的原型,所以一个对象总有一个"prototype"键.不过,现在可以使用map = Object.create(null)来创建一个没有原型的对象.
  • 一个对象的键只能是字符串,但一个Map的键可以是任意值.
  • 你可以很容易的得到一个Map的键值对个数(size),而只能跟踪一个对象的键值对个数

集合(Set)对象允许你存储任意类型的唯一值,无论是 primitive values 还是对象引用。