博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Map与object的区别
阅读量:5276 次
发布时间:2019-06-14

本文共 4493 字,大约阅读时间需要 14 分钟。

Map 对象保存键值对。任何值(对象或者) 都可以作为一个键或一个值。

语法

new Map([iterable])

参数

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

描述

一个Map对象以插入顺序迭代其元素 — 一个   循环为每次迭代返回一个[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) () 和 版本这个已经更改了。

Objects 和 maps 的比较

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

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

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

如果你不确定要使用哪个,请思考下面的问题:

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

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

属性

Map.length
属性 length 的值为 0 。
本构造函数用于创建派生对象。
表示 
Map 构造器的原型。 允许添加属性从而应用于所有的 
Map 对象。

Map 实例

所有的 Map 对象实例都会继承 。

属性

 

Map.prototype.constructor
返回一个函数,它创建了实例的原型。默认是 函数。
返回Map对象的键/值对的数量。

 

方法

 

移除Map对象的所有键/值对 。
移除任何与键相关联的值,并且返回该值,该值在之前会被Map.prototype.has(key)返回为true。之后再调用Map.prototype.has(key)会返回false。
返回一个新的
Iterator 对象,它按插入顺序包含了Map对象中每个元素的
[key, value]
数组
按插入顺序,为
Map对象里的每一键值对调用一次callbackFn函数。如果为forEach提供了thisArg,它将在每次回调中作为this值。
返回键对应的值,如果不存在,则返回undefined。
返回一个布尔值,表示Map实例是否包含键对应的值。
返回一个新的
Iterator对象, 它按插入顺序包含了Map对象中每个元素的
设置Map对象中键的值。返回该Map对象。
返回一个新的
Iterator对象,它按插入顺序包含了Map对象中每个元素的
返回一个新的
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
Standard Initial definition.
Living Standard  

浏览器兼容情况

 

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

38 [1]

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

转载于:https://www.cnblogs.com/h2zZhou/p/7477544.html

你可能感兴趣的文章
模板设计模式的应用
查看>>
实训第五天
查看>>
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>
装配SpringBean(一)--依赖注入
查看>>
java选择文件时提供图像缩略图[转]
查看>>
方维分享系统二次开发, 给评论、主题、回复、活动 加审核的功能
查看>>
Matlab parfor-loop并行运算
查看>>
string与stringbuilder的区别
查看>>
2012-01-12 16:01 hibernate注解以及简单实例
查看>>
iOS8统一的系统提示控件——UIAlertController
查看>>
PAT甲级——1101 Quick Sort (快速排序)
查看>>
python创建进程的两种方式
查看>>
1.2 基础知识——关于猪皮(GP,Generic Practice)
查看>>
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>
最简单的线程同步的例子
查看>>