Map Set
方法都可以使用for...of
方法,不可以使用for...in
Map
Map与get、set。Map存储key-value键值对,重复向同一个key添加value,会替代原来的value
//两种创建方式
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
var m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined
Set
Set中只存储key且不会有重复的key,因此重复添加key不会有任何变化,没有length属性
//两种创建方式
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
s2.add(4)//一次只能添加一个
s2.delete(3)
s2.clear()//移除Set内所有元素
Set.has(value)
Set.forEach(callbackFn[, thisArg])
Map
特性:
Map.length=0
Map.prototype.size 返回Map对象的键/值对的数量。
Map的键可以是任意值,包括函数、对象和任意基本类型
Map 中的 key 是有序的。因此,当迭代的时候,一个 Map 对象以插入的顺序返回键值。
Map 是 iterable 的,所以可以直接被迭代。
在频繁增删键值对的场景下表现更好
如果我们使用对象作为常规 Map 的键,那么当 Map 存在时,该对象也将存在。它会占用内存,并且应该不会被(垃圾回收机制)回收,除非使用map.clear()
WeakMap
特性:
不可迭代
key值只能是对象
key值与其指向的对象是一种弱指向,不会影响其是否被垃圾回收机制删除
当key值对象没有被别处引用时,该对象会被从内存中删除
weakset
特性
WeakSet
的表现类似:
- 与
Set
类似,但是我们只能向WeakSet
添加对象(而不能是原始值)。 - 对象只有在其它某个(些)地方能被访问的时候,才能留在 set 中。
- 跟
Set
一样,WeakSet
支持add
,has
和delete
方法,但不支持size
和keys()
,并且不可迭代。