ES6 新增 Map 是一组健值对。具有极快的查找速度 函数、对象、基本类型都可以作为键或值。** **解决了对象中只能使用 String 和 Symbol 作为键的问题 可以理解为加强型的对象

* Map 中的元素是有序的,拥有数字索引(类似数组)。每个索引对应的值是对象,该对象拥有两个属性:key 和 value
**

声明定义

new Map(array)

传递的数组是一个二维数组,二维数组中每个数组只有前两位有效,分别代表键和值*

**params** { array } array 二维数组 **return** { Map }

  1. var map = new Map(
  2. [
  3. ["name", "zhangsan"],
  4. ["age", 18]
  5. ]
  6. )
  7. console.log(map); // Map { "name" => "zhangsan", "age" => 18 }

元素管理

map.size

**_desc_** 获取数量 **params** { Map } map **return** { number }

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18],
  4. ["sex", "male"]
  5. ]);
  6. console.log(map.size); // 3

map.set(key, value)

* 支持链式操作

**_desc_** 添加元素 **params** { Map } map **params** { any } key 键 **params** { any } value 值 **return** { Map } 执行添加操作后的 Map

  1. var map = new Map();
  2. console.log(map); // Map(0) {}
  3. map.set("name", "zhangsan").set({ key: 0 }, 18)
  4. console.log(map); // Map { "name" => "zhangsan", { key: 0 } => 18 }

map.get(key)**

**_desc_** 获取值 **params** { Map } map **params** { any } key 键 **return**_ { any } 根据键获取的值

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18],
  4. ["sex", "male"]
  5. ]);
  6. console.log(map.get("name")); // "zhangsan"

map.delete(key)**

**_desc_** 删除元素 **params** { Map } map **params** { any } key 键 **return**_ { boolean }

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18],
  4. ["sex", "male"]
  5. ]);
  6. map.delete("name");
  7. console.log(map); // Map { "age" => 18, "sex" => "male" }

map.clear()**

**_desc_** 清空 Map 中所有元素 **params** { Map } map **return**_ { void }

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18],
  4. ["sex", "male"]
  5. ]);
  6. map.clear();
  7. console.log(map); // Map(0) {}

map.has(key)**

**_desc_** 检测元素是否存在 **params** { Map } map **params** { any } key 键 **return**_ { boolean }

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18],
  4. ["sex", "male"]
  5. ]);
  6. var bool = map.has("name");
  7. console.log(bool); // true

迭代器

map.keys()

**params** { Map } map **return**_ { MapIterator } 键组成的 Map 迭代对象

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18]
  4. ]);
  5. console.log(map.keys()); // MapIterator { "name", "age" }

map.values()

**params** { Map } map **return**_ { MapIterator } 值组成的 Map 迭代对象

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18]
  4. ]);
  5. console.log(map.values()); // MapIterator { "zhangsan", 18 }

map.entries()

**params** { Map } map **return**_ { MapIterator } 键和值组成的 Map 迭代对象

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18]
  4. ]);
  5. console.log(map.entries()); // MapIterator { "name" => "zhangsan", "age" => 18 }

数组转换

* Map 类型转换为数组类型

展开运算符

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18]
  4. ]);
  5. console.log([...map]); // [["name", "zhangsan"], ["age", 18]]
  6. console.log([...map.keys()]); // ["name", "age"]
  7. console.log([...map.values()]); // ["zhangsan", 18]
  8. console.log([...map.entries()]); // [["name", "zhangsan"], ["age", 18]]

Array.from

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18]
  4. ]);
  5. console.log(Array.from(map)); // [["name", "zhangsan"], ["age", 18]]
  6. console.log(Array.from(map.keys())); // ["name", "age"]
  7. console.log(Array.from(map.values())); // ["zhangsan", 18]
  8. console.log(Array.from(map.entries())); // [["name", "zhangsan"], ["age", 18]]

循环遍历

for of

* 先通过迭代器操作,获取 Map 迭代对象,再进行循环遍历操作

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18]
  4. ]);
  5. for(let key of map.keys()) {
  6. console.log(key); // "name" ---> "key"
  7. }
  8. for(let value of map.values()) {
  9. console.log(value); // "zhangsan" ---> 18
  10. }

forEach

* 直接对 Map 操作,可以获取 Map 的键和值

  1. var map = new Map([
  2. ["name", "zhangsan"],
  3. ["age", 18]
  4. ]);
  5. map.forEach((value, key) => {
  6. console.log(`${key}=>${value}`); // "name=>zhangsan" ---> "age=>18"
  7. })

WeakMap**

WeakMap 是一种特殊的 Map

* 键名必须是对象,否则报错:Invalid value used as weak map key
* WeakMap 的键名是弱引用,健值是正常引用
* 垃圾回收不考虑 WeakMap 的键名,不会改变引用计数器,键在其他地方不被引用时即删除
* 因为 WeakMap 是弱引用,不可以进行 forEach 等遍历操作
*因为 WeakMap 是弱引用,WeakMap 没有迭代器方法和 size 属性
*
当键的外部引用删除时,需要自动删除数据时使用 WeakMap**

什么是弱引用? 如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存 弱引用的对象不可遍历!

new WeakMap(array)

* 传递的数组是一个二维数组,二维数组中每个数组只有前两位有效,分别代表键和值

**_desc_** WeakMap 声明定义 **params** { array } array 二维数组 **return** { WeakMap }

  1. var weakMap = new WeakMap([
  2. [{ key: "name" }, "zhangsan"],
  3. [{ key: "age" }, 18]
  4. ]);
  5. console.log(weakMap); // WeakMap {{...} => 18, {...} => "zhangsan"}