Map&Set
集合 Set
Set是一组不会重复的值集合,可以按照添加顺序遍历
Set判断值是否相等是使用===,但是需要注意 NaN,虽然NaN !== NaN,但是在Set中NaN是恒等的,所以NaN在Set中不会重复。
Set API
Set.prototype.size:实例属性,返回集合长度Set.prototype.add(value):添加值到集合,并返回集合,重复元素不会被添加到集合,重复添加不会对集合产生任何变化,不会影响元素的顺序。Set.prototype.clear()Set.prototype.delete(value):删除值并返回在执行操作之前的Set.prototype.has(value)的值,即如果有改值则返回true否则返回false。Set.prototype.has(value):booleanSet.prototype.keys()Set.prototype.values()Set.prototype.entries()Set.prototype.forEach(callback, thisArg)
Set 和 Array
Set和Array比较类似都是有顺序的值集合,主要有以下区别:
Array的值是可以重复的,Set是不重复的Array可以通过index获得对应的值,Set不可以Set的has和delete等方法对集合的增删操作更加便捷高效Array的filter、map、some等方法在特定场景更加便捷
Array和Set互相转换:
- Set > Array:
[...set]Array.from(set);:
- Array > Set:
new Set(array)
Set为无重复集合,所以Array中重复的元素都会被删除,可以使用[...new Set(array)]的方式实现数组去重。
WeakSet
WeakSet是弱保持对象集合,弱保持(弱引用)即会被 GC 忽略的引用,当一个对象只被弱引用那么 JavaScript 在做 GC 的时候会忽略这引用对这个对象进行 GC。也就是说 WeakSet 中的值如果没有被其它对象引用,那么这个值就会被回收。
WeakSet和Set的区别是:
- 只能存储对象
- 内部对象不能遍历,因为
WeakSet中的引用都是弱引用
TODO:WeakSet 使用场景
- DOM 引用
字典 Map
一个简单的键值对映射集合,任何值(对象或原始类型)都可以作为键值使用,键值相等判断逻辑和Set相同。
并且可以记录插入顺序,可以按照插入顺序遍历所有的元素。
Map API
Map.prototype.length:实例属性返回集合长度Map.prototype.set(key, value):添加值到Map并返回Map,重复添加只会更新值,并不会改变键的顺序。Map.prototype.get(key):Map.prototype.has(key):Map.prototype.delete(key):Map.prototype.clean():Map.prototype.keys():Map.prototype.values():Map.prototype.entries():Map.prototype.forEach((value, key) => {}):
Map 和 Object
- 键值类型:
Object的键只能为String或Symbol类型Map的键可以为任何类型; - 意外键值:对象原型链上的键值是潜在的意外键,
Map不会; - 键值顺序:对象的键值是无序的,
Map的键值顺序和添加顺序一致的; - 集合尺寸:
Map的size属性可以很方便的获取尺寸; - 性能:在频繁的增删场景下
Map的性能更优; - 遍历:
Map可以直接进行迭代,对象需要借助Object.keys()等方法;
TODO:WeakMap
- Map 对象的键可以是任何类型,但 WeakMap 对象中的键只能是对象引用;
- WeakMap 不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制);
- WeakMap 对象是不可枚举的,无法获取集合的大小。