Map

Object VS Map

Map和Object都是映射,即是键值对的集合,它们有什么区别呢?

Object Map
默认值 每个Object实例都有一个原型,且原型上的键名可能会和自己对象上的键名冲突 默认不包含任何值,只有显式插入的值
键的类型 String或者Symbol
注:可以使用其他类型的键名,但最终会隐式转化为字符串
任意
迭代性 不可迭代,需借助Object.entries()/Object.keys()/Object.values() 可迭代(for entry of map/forEach)
键值对数 手动计算 size属性

创建一个Map实例

可以将一个二元数组(键值对)作为元素的数组传入构造函数,该数组内的元素会以数组顺序进行处理加入到映射对象中,如果存在相同的键,则按照FIFO(先进先出)原则,即后面会覆盖前面的。

  1. const map = new Map([['key1','value1'],['key2','value2']]);

实例的属性和方法

属性/方法 描述 返回值
map.size 映射中键值对的数量 返回映射中键值对的数量
map.get(key) 获取映射中指定键对应的值 返回指定键对应的值,如果不存在指定的键,则返回undefined
map.set(key,value) 新增或者编辑映射中的键值对
注:返回映射实例,因此可以通过点运算符进行连续操作
返回当前Map实例
map.has(key) 检查映射中是否含有某个键 布尔值
map.delete(key) 删除映射中的键值对 布尔值,表示是否删除成功
map.clear() 清空映射,即删除所有键值对 /
map.forEach((value,key,map)=>{}[,context]) 遍历 /
map.entries() 遍历 返回一个以二元数组即键值对作为元素的可迭代对象
map.keys() 遍历 返回一个以当前映射中所有键作为元素的可迭代对象
map.values() 遍历 返回一个以当前映射中所有值作为元素的可迭代对象

应用

可用在条件判断中,参见
JavaScript 复杂判断的更优雅写法

WeakMap

约束

  1. 实例的键只能是引用类型,且一旦键是无引用对象,键值对就会被自动清除出去。
  2. 实例只有四个方法,get,set,has,delete,因此不能迭代遍历键。

    实例的属性和方法

    | 属性或方法 | 描述 | | —- | —- | | weakmap.get(key) | 获取映射中键对应的值 | | weakmap.set(key,value) | 新增或者编辑映射中的键值对
    注:返回映射实例,因此可以通过点运算符进行连续操作 | | weakmap.has(key) | 检查映射中是否含有某个键值对 | | weakmap.delete(key) | 删除映射中的键值对 |