Map

这篇翻译不完整。请帮忙从英语翻译这篇文章

该特性处于 ECMAScript 6 规范草案中,目前的实现在未来可能会发生微调,请谨慎使用。

概述

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

在判断两个值是否为同一个键的时候,使用的并不是===运算符,而是使用了一种称之为"same-value"的内部算法, 该算法很特殊, 对于Map对象来说, +0 (按照以往的经验与 -0 是严格相等的)和-0 是两个不同的键. 而NaN在作为Map对象的键时和另外一个NaN是一个相同的键(尽管NaN !== NaN).

API

Constructor 描述
new Map([iterable])

返回一个新的Map对象。如果参数iterable是一个数组或者其他可迭代的对象--它的元素是键值对,这样这些的每一个键值对都可以添加到新的Map里面去

方法 描述
myMap.get(key) 返回键key关联的值,如果该键不存在则返回undefined .
myMap.set(key, value) 设置键keymyMap中的值为value.返回 undefined.
myMap.has(key) 返回一个布尔值,表明键key是否存在于myMap 中.
myMap.delete(key) 删除键 key 及对应的值. 在这之后, myMap.has(key)将返回 false
myMap.clear() 清空myMap中的所有键值对.
属性 描述
myMap.size

返回myMap中键值对的数量.

在Firefox 18及之前版本中,size()是个方法.从Firefox 19开始,size成了属性.

例子

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 () {}

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"

JavaScript有两个0值,+0和-0.虽然+0 === -0,但是当这两个0作为Map的键时,被认为是两个不同的值.

var myMap = new Map();
myMap.set(0, "正零");
myMap.set(-0, "负零");
 
0 === -0; // true
 
myMap.get(-0); // "负零"
myMap.get(0);  // "正零"

Object和Map的比较

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

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

浏览器兼容性

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

31 [1]
38

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

相关链接

文档标签和贡献者

向此页面作出贡献: fskuok, teoli, ziyunfei, zhangyaochun1987
最后编辑者: fskuok,