Map&Set

集合 Set

Set是一组不会重复值集合可以按照添加顺序遍历

Set判断值是否相等是使用===,但是需要注意 NaN,虽然NaN !== NaN,但是在SetNaN是恒等的,所以NaNSet中不会重复。

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):boolean
  • Set.prototype.keys()
  • Set.prototype.values()
  • Set.prototype.entries()
  • Set.prototype.forEach(callback, thisArg)

Set 和 Array

SetArray比较类似都是有顺序的值集合,主要有以下区别:

  • Array的值是可以重复的,Set是不重复的
  • Array可以通过index获得对应的值,Set不可以
  • Sethasdelete等方法对集合的增删操作更加便捷高效
  • Arrayfiltermapsome等方法在特定场景更加便捷

ArraySet互相转换:

  • Set > Array:
    • [...set]
    • Array.from(set);:
  • Array > Set:new Set(array)

Set为无重复集合,所以Array中重复的元素都会被删除,可以使用[...new Set(array)]的方式实现数组去重。

WeakSet

WeakSet弱保持对象集合,弱保持(弱引用)即会被 GC 忽略的引用,当一个对象只被弱引用那么 JavaScript 在做 GC 的时候会忽略这引用对这个对象进行 GC。也就是说 WeakSet 中的值如果没有被其它对象引用,那么这个值就会被回收。

WeakSetSet的区别是:

  1. 只能存储对象
  2. 内部对象不能遍历,因为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的键只能为StringSymbol类型Map的键可以为任何类型;
  • 意外键值:对象原型链上的键值是潜在的意外键,Map不会;
  • 键值顺序:对象的键值是无序的,Map的键值顺序和添加顺序一致的;
  • 集合尺寸Mapsize属性可以很方便的获取尺寸;
  • 性能:在频繁的增删场景下Map的性能更优;
  • 遍历Map可以直接进行迭代,对象需要借助Object.keys()等方法;

TODO:WeakMap

  • Map 对象的键可以是任何类型,但 WeakMap 对象中的键只能是对象引用;
  • WeakMap 不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制);
  • WeakMap 对象是不可枚举的,无法获取集合的大小。

results matching ""

    No results matching ""