Map与object的别

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 的键可以是任意值。
  • 卿得由此size属性很容易地获取一个Map的键值对个数,假如目标的键值对个数只能手动确认。

但是就并无意味你可随意使用 Map,对象仍旧是最常用的。``Map 实例只称用于汇(collections),你当考虑改动你原来的代码——先前使对象来应付集合的地方。对象应该据此其字段和办法来作记录之。
而你切莫确定要以谁,请考虑下面的问题:

  • 于运行前 key 是否是大惑不解之,是否用动态地询问 key 呢?
  • 是否拥有的价都是联路,这些价值好彼此换么?
  • 是否需要不是字符串类型的 key ?
  • 键值对常多或者去除么?
  • 是否生擅自单还非常容易改变的键值对?
  • 这个集好全方位历么(Is the collection iterated)?

要是以上均是“是”的话,那么你要用 Map 来保存这个集。 相反,你有定位数目的键值对,独立操作其,区分它们的用法,那么您要之凡目标。

属性

Map.length
属性 length 的值为 0 。

get Map[@@species]
比如构造函数用于创造派生对象。

Map.prototype
表示 Map 构造器的原型。 允许添加属性从而以被拥有的 Map 对象。

Map 实例

所有的 Map 对象实例都见面继承
Map.prototype

属性

 

Map.prototype.constructor
回到一个函数,它创建了实例的原型。默认是Map函数。

Map.prototype.size
回来Map对象的键/值对的数量。

 

方法

 

Map.prototype.clear()
移除Map对象的有着键/值对 。

Map.prototype.delete(key)
移除任何与键相关联的值,并且返回该值,该值在前见面给Map.prototype.has(key)返回吗true。之后再调用Map.prototype.has(key)会返回false。

Map.prototype.entries()
回一个初的 Iterator 对象,它仍插顺序包含了Map对象被每个元素的
[key, value] 数组

Map.prototype.forEach(callbackFn[, thisArg])
遵照插顺序,为
Map目标里之各一样键值对调用一破callbackFn函数。如果为forEach提供了thisArg,它以于历次回调中当this值。

Map.prototype.get(key)
归来回键对应之值,如果不有,则返回undefined。

Map.prototype.has(key)
回去一个布尔值,表示Map实例是否包含键对应的价值。

Map.prototype.keys()
回一个初的 Iterator目标,
它以插顺序包含了Map对象吃每个元素的

Map.prototype.set(key, value)
装Map对象中键的价。返回该Map对象。

Map.prototype.values()
回去一个新的Iterator对象,它本插顺序包含了Map对象中每个元素的

Map.prototype[@@iterator]()
返回一个新的Iterator目标,它本插顺序包含了Map对象中每个元素的
[key, value] 数组

 

示例

采用映射对象

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作为炫耀的键

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"

使用for..of方法迭代映射

炫耀也可以使用for..of循环来实现迭代:

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// 将会显示两个log。一个是"0 = zero"另一个是"1 = one"

for (var key of myMap.keys()) {
  console.log(key);
}
// 将会显示两个log。 一个是 "0" 另一个是 "1"

for (var value of myMap.values()) {
  console.log(value);
}
// 将会显示两个log。 一个是 "zero" 另一个是 "one"

for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}
// 将会显示两个log。 一个是 "0 = zero" 另一个是 "1 = one"

使用forEach()方法迭代映射

辉映也得以经forEach()方法迭代:

myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)
// 将会显示两个logs。 一个是 "0 = zero" 另一个是 "1 = one"

照与数组对象的关系

var kvArray = [["key1", "value1"], ["key2", "value2"]];

// 使用映射对象常规的构造函数将一个二维键值对数组对象转换成一个映射关系
var myMap = new Map(kvArray);

myMap.get("key1"); // 返回值为 "value1"

// 使用展开运算符将一个映射关系转换成一个二维键值对数组对象
console.log(uneval([...myMap])); // 将会向您显示和kvArray相同的数组

// 或者使用展开运算符作用在键或者值的迭代器上,进而得到只含有键或者值得数组
console.log(uneval([...myMap.keys()])); // 输出 ["key1", "key2"]

规范

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

浏览器兼容情况

 

  • Desktop
  • Mobile
Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support

38 [1]

12 13 (13) 11 25 7.1
Constructor argument: new Map(iterable) 38 12 13 (13) 未实现 25 9
iterable 38 12 17 (17) 未实现 25 7.1
Map.clear() 31
38
12 19 (19) 11 25 7.1
Map.keys(), Map.values(), Map.entries() 37
38
12 20 (20) 未实现 25 7.1
Map.forEach() 36
38
12 25 (25) 11 25 7.1
Key equality for -0 and 0 34
38
12 29 (29) 未实现 25 9
Constructor argument: new Map(null) (Yes) 12 37 (37) 11 (Yes) 9
Monkey-patched set() in Constructor (Yes) 12 37 (37) 未实现 (Yes) 9
Map[@@species] 51 13 41 (41) 未实现 38 10
Map() without new throws (Yes) 12 42 (42) 11 (Yes) 9

 

[1] Starting with Chrome 31,the feature was available behind a
preference. In chrome://flags, activate the entry “Enable Experimental
JavaScript”.