ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 也实现了iterator 接口,所以可以使用『扩展运算符』和『for…of…』进行遍历。

Map 的属性和方法:

  • size 返回 Map 的元素个数
  • set 增加一个新元素,返回当前 Map
  • get 返回键名对象的键值
  • has 检测 Map 中是否包含某个元素,返回 boolean 值
  • clear 清空集合,返回 undefined


map

  1. let myMap = new Map();
  2. let keyObj = {};
  3. let keyFunc = function() {};
  4. let keyString = 'a string';
  5. // 添加键
  6. myMap.set(keyString, "和键'a string'关联的值");
  7. myMap.set(keyObj, "和键keyObj关联的值");
  8. myMap.set(keyFunc, "和键keyFunc关联的值");
  9. myMap.size; // 3
  10. // 读取值
  11. myMap.get(keyString); // "和键'a string'关联的值"
  12. myMap.get(keyObj); // "和键keyObj关联的值"
  13. myMap.get(keyFunc); // "和键keyFunc关联的值"
  14. myMap.get('a string'); // "和键'a string'关联的值"
  15. // 因为keyString === 'a string'
  16. myMap.get({}); // undefined, 因为keyObj !== {}
  17. myMap.get(function() {}); // undefined, 因为keyFunc !== function () {}

NAN作为键值时相等

NaN 也可以作为Map对象的键。虽然 NaN 和任何值甚至和自己都不相等(NaN !== NaN 返回true),但下面的例子表明,NaN作为Map的键来说是没有区别的:

  1. let myMap = new Map();
  2. myMap.set(NaN, "not a number");
  3. myMap.get(NaN); // "not a number"
  4. let otherNaN = Number("foo");
  5. myMap.get(otherNaN); // "not a number"
  • 键的比较是基于 [sameValueZero](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Equality_comparisons_and_sameness#%E9%9B%B6%E5%80%BC%E7%9B%B8%E7%AD%89) 算法:
  • NaN 是与 NaN 相等的(虽然 NaN !== NaN),剩下所有其它的值是根据 === 运算符的结果判断是否相等。
  • 在目前的ECMAScript规范中,-0+0被认为是相等的,尽管这在早期的草案中并不是这样。有关详细信息,请参阅浏览器兼容性 表中的“Value equality for -0 and 0”。

    map() 构造函数

    new Map( [iterable] )
    Iterable 可以是一个数组或者其他 iterable 对象,其元素为键值对(两个元素的数组,例如: [[ 1, ‘one’ ],[ 2, ‘two’ ]])。 每个键值对都会添加到新的 Map。null 会被当做 undefined。
    1. let myMap = new Map([
    2. [1, 'one'],
    3. [2, 'two'],
    4. [3, 'three'],
    5. ])