Object 本质上是键值对的集合 但是只能使用字符串当键
Map 类似于对象,也是键值对的集合,但是‘键’的范围不局限于字符串,各种类型的值都可以当作键
map 构造函数接受具有iterator 接口,并且每个成员方法都是双元素的数组([key,value])的结构都可以当作Map的参数
1 | let map = new Map([ |
只有针对同一个值的引用,Map 结构才将其视为同一个键1
2
3let map = new Map()
map.set(['a'],1)
map.get(['a']) // undefined
看下面的例子就会理解
1 | const map = new Map(); |
变量k1和k2的值是一样的,但是它们在 Map 结构中被视为两个键,因为k1 和 k2 指向不同的引用
由上可知,Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。
这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。
如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,比如0和-0就是一个键,布尔值true和字符串true则是两个不同的键。另外,undefined和null也是两个不同的键。虽然NaN不严格相等于自身,但 Map 将其视为同一个键。
clear方法清除所有成员,没有返回值。
遍历方法 keys values entries foreach
1 | const map = new Map([ |
// Map 转为数组 …
1 | const myMap = new Map() |
// 数组 转为 Map
1 | new Map([ |
// Map 转为对象 如果所有 Map 的键都是字符串,它可以无损地转为对象。 如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名
1 | function strMapToObj(strMap) { |
对象转为 Map1
2let obj = {"a":1, "b":2};
let map = new Map(Object.entries(obj));
json1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16json1 = '{"n1":123, "n2": {"a":1, "b": 2}}'
json2 = '"[{"a":1,"b":2},{"c":333,"d":{"d":1}}]"'
// json 转换为 map
let obj = JSON.parse(json1)
let map1 = new Map(Object.entries(obj))
obj = [
{a: 1,
b:2},
{c: 333,
d:{d:1
}}
]
m1 = new Map(Object.entries(JSON.parse(JSON.stringfy(obj))))