Mozilla's getting a new look. What do you think? https://mzl.la/brandsurvey

Map对象就是简单的键/值映射。其中键和值可以是任意值(对象或者原始值)。

语法

new Map([iterable])

参数

iterable
Iterable 可以是一个数组或者其他 iterable 对象,其元素或为键值对,或其为两个元素的数组。 每个键值对都会添加到新的 Map。null 会被当做 undefined。

描述

Map 对象会按元素插入的顺序遍历— for...of 循环每次遍历都会返回一个 [key, value] 数组。

键的比较(Key equality)

键的比较是基于 "same-value" 算法:NaN 是与 NaN 相同的(虽然 NaN !== NaN),剩下所有其它的值是根据 === 运算符的结果判断是否相等。在 ECMAScript 6 草稿的早期版本中视 -0 和 +0 为不相同的 (虽然 -0 === +0),在近期版本里这个问题已经被更正,且在 Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (bug 952870) 和近期的 nightly Chrome 版本这个已经更改了。

Objects 和 maps 的比较

Object 和 Map类似的一点是,它们都允许你按键存取一个值,都可以删除键,还可以检测一个键是否绑定了值.因此,一直以来,我们都把对象当成Map来使用,不过,现在有了Map,下面的区别解释了为什么使用Map更好点.

  • 一个对象通常都有自己的原型,所以一个对象总有一个"prototype"键。不过,从 ES5 开始可以使用map = Object.create(null)来创建一个没有原型的对象。
  • 一个对象的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
  • 你可以很容易的得到一个Map的键值对个数,而只能跟踪一个对象的键值对个数。

但是这并不意味着你可以随意使用 Map,对象仍旧是最常用的Map 实例只适合用于集合(collections),你应当考虑修改你原来的代码——先前使用对象来对付集合的地方。对象应该用其字段和方法来作为记录的。
如果你不确定要使用哪个,请思考下面的问题:

  • 在运行之前 key 是否是未知的,是否需要动态地查询 key 呢?
  • 是否所有的值都是统一类型,这些值可以互换么?
  • 是否需要不是字符串类型的 key ?
  • 键值对经常增加或者删除么?
  • 是否有任意个且非常容易改变的键值对?
  • 这个集合可以遍历么(Is the collection iterated)?

假如以上全是“是”的话,那么你需要用 Map 来保存这个集。 相反,你有固定数目的键值对,独立操作它们,区分它们的用法,那么你需要的是对象。

属性

Map.length
The value of the length property is 0.
get Map[@@species]
本构造函数用于创建派生对象。
Map.prototype
表示 Map 构造器的原型。 允许添加属性从而应用于所有的 Map 对象。

Map 实例

所有的 Map 实例都会继承 Map.prototype

属性

方法

示例

Using the Map object

var myMap = new Map();
 
var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";
 
// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键keyObj关联的值");
myMap.set(keyFunc, "和键keyFunc关联的值");
 
myMap.size; // 3
 
// 读取值
myMap.get(keyString);    // "和键'a string'关联的值"
myMap.get(keyObj);       // "和键keyObj关联的值"
myMap.get(keyFunc);      // "和键keyFunc关联的值"
 
myMap.get("a string");   // "和键'a string'关联的值"
                         // 因为keyString === 'a string'
myMap.get({});           // undefined, 因为keyObj !== {}
myMap.get(function() {}) // undefined, 因为keyFunc !== function () {}

Using NaN as Map keys

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

var myMap = new Map();
myMap.set(NaN, "not a number");

myMap.get(NaN); // "not a number"

var otherNaN = Number("foo");
myMap.get(otherNaN); // "not a number"

Iterating Maps with for..of

Maps can be iterated using a for..of loop:

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

for (var key of myMap.keys()) {
  console.log(key);
}
// Will show 2 logs; first with "0" and second with "1"

for (var value of myMap.values()) {
  console.log(value);
}
// Will show 2 logs; first with "zero" and second with "one"

for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

Iterating Maps with forEach()

Maps can be iterated using the forEach() method:

myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

Iterating Maps with forEach()

Maps can be iterated using the forEach() method:

myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

Specifications

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
Map
Standard Initial definition.
ECMAScript 2017 Draft (ECMA-262)
Map
Draft  

浏览器兼容性

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support

38 [1]

13 (13) 11 25 7.1
Constructor argument: new Map(iterable) 38 13 (13) 未实现 25 未实现
iterable 38 17 (17) 未实现 25 7.1
Map.clear() 31
38
19 (19) 11 25 7.1
Map.keys(), Map.values(), Map.entries() 37
38
20 (20) 未实现 25 7.1
Map.forEach() 36
38
25 (25) 11 25 7.1
Key equality for -0 and 0 34
38
29 (29) 未实现 25 未实现
Constructor argument: new Map(null) (Yes) 37 (37) ? ? ?
Monkey-patched set() in Constructor (Yes) 37 (37) ? ? ?
Map[@@species] ? 41 (41) ? ? ?
Map() without new throws ? 42 (42) ? ? ?
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 未实现 38 [1] 13.0 (13) 未实现 未实现 8
Constructor argument: new Map(iterable) 未实现 38 13.0 (13) 未实现 未实现 未实现
iterable 未实现 未实现 17.0 (17) 未实现 未实现 8
Map.clear() 未实现 31
38
19.0 (19) 未实现 未实现 8
Map.keys(), Map.values(), Map.entries() 未实现 37
38
20.0 (20) 未实现 未实现 8
Map.forEach() 未实现 36
38
25.0 (25) 未实现 未实现 8
Key equality for -0 and 0 未实现 34
38
29.0 (29) 未实现 未实现 未实现
Constructor argument: new Map(null) ? (Yes) 37.0 (37) ? ? ?
Monkey-patched set() in Constructor ? (Yes) 37.0 (37) ? ? ?
Map[@@species] ? ? 41.0 (41) ? ? ?
Map() without new throws ? ? 42.0 (42) ? ? ?

相关链接

文档标签和贡献者

标签: 
 此页面的贡献者: Ende93, sqqihao, fskuok, teoli, ziyunfei, zhangyaochun1987
 最后编辑者: Ende93,