ES6-两分钟学会Map对象高级用法

423 阅读3分钟

前言

  javaScript中的Object对象,本质上是键值对的集合(Hash 结构),但Object对象只能使用字符串当作key,这让它的使用受到了许多限制。为了解决这个问题,ES6新增了一种新的数据结构Map

一、Map是什么?

  Map是ECMAScript 6的新增特性,是一种新的集合类型,为javascript带来了真正的键/值存储机
制。它类似于对象,也是键值对的集合,但是"键"的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了"字符串—值"的对应,Map 结构提供了"值—值"的对应,是一种更完善的 Hash 结构实现。如果你需要"键值对"的数据结构,Map 比 Object 更合适。 (引用自阮一峰ECMAScript 6入门)

  • Map 对象存储键值对,且键可以是任何数据类型。

  • Map 对象保存了键的原始插入顺序。

  • Map 对象具有表示映射大小的属性。

二、Map 和 Object 的区别

一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。

Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。

Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。

Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

三、Map对象的属性

1. size

作用: size属性返回 Map 结构的成员总数。

  const map = new Map();
  map.set("Very", "稀土");
  map.set("Cool", "掘金");
  console.log(map.size); // 输出:2

2. set(key, value)

作用: set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。

  const map = new Map();
  const newMap = map.set("VeryCool", "稀土掘金");
  console.log(newMap);  // 输出:{'VeryCool' => '稀土掘金'}

3. get(key)

作用: get方法读取key对应的键值,如果找不到key,返回undefined

  const map = new Map();
  map.set("VeryCool", "稀土掘金");
  console.log(map.get("VeryCool"));  // 输出:稀土掘金

4. has(key)

作用: has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中,存在返回true,失败返回false

  const map = new Map();
  map.set("VeryCool", "稀土掘金");
  console.log(map.has("VeryCool"));  // 输出:true

5. delete(key)

作用: delete方法删除某个键,返回true。如果删除失败,返回false

  const map = new Map();
  map.set("VeryCool", "稀土掘金");
  console.log(map.delete("VeryCool"));  // 输出:true
  console.log(map);                     // 输出:{size: 0}

6. clear()

作用: clear方法清除所有成员,没有返回值。

  const map = new Map();
  map.set("VeryCool", "稀土掘金");
  map.clear();
  console.log(map); // 输出:{size: 0}

四、Map对象的操作

1. Map 与 Array的转换

  const Array = [
    ["key1", "value1"],
    ["key2", "value2"],
  ];
  // Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
  const map = new Map(Array);
  // 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
  const newArray = Array.from(map);

2. Map的克隆

  const map1 = new Map([["key1", "value1"], ["key2", "value2"]]);
  const map2 = new Map(map1);

3. Map的合并

  const map1 = new Map([
    [1, "Very"],
    [2, "Cool"],
  ]);
  const map2 = new Map([
    [1, "稀土"],
    [2, "掘金"],
  ]);
  const newMap = new Map([...map1, ...map2]);

五、选择Map的原因

1. 内存占用

Map 存储键值对相比 Object 节省50%的空间。

2. 插入性能

如果涉及大量键值对插入操作,Map 的性能更佳。

3. 查找速度

Object 和 Map 中查找键/值对的性能差异较小。

4、删除性能

如果涉及大量键值对插入操作,Map 的性能更佳。

(文章参考自阮一峰ECMAScript 6入门)

结尾.jpg