ES6 提供的另一种新的引用类型的数据结构 它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键)
以前引用类型中的对象也是键值对的集合 但是键限于字符串
总结起来就是:
const m = new Map();
const o = { p: 'Hello World' };
m.set(o, 'content')
console.log( m.get(o) ); //"content"
console.log( m.has(o) );// true
console.log( m.delete(o) );// true
console.log( m.has(o) );// false
为什么instanceof可以判断对象或数组?
https://blog.csdn.net/qq_34569497/article/details/133889333
let res = map instanceof Map
let resMap = Object.prototype.toString.call(map)
console.log(res); // true
console.log(resMap); // [object Map]
对象作为键,会隐式的调用toString()方法,从而导致后一个覆盖前一个键
let o1 = { a: 1 }
let o2 = { b: 1 }
let o3 = {}
o3[o1] = 1
o3[o2] = 2
console.log(o3) // [object Object]: 2
Object.keys(o3).map((v, i) => {
console.log(v); // [object Object]
console.log(i); // 0
console.log(typeof v); // string
})
Map就不存在覆盖:
let o1 = { a: 1 }
let o2 = { b: 1 }
let o3 = new Map()
o3.set(o1, '123')
o3.set(o2, '234')
console.log(o3);
console.log(o3.get(o1));
console.log(o3.get(o2));
作为构造函数,Map 也可以接受一个数组作为参数。注意该数组的成员是一个个表示键值对的数组。
const map = new Map([
['name', '张三'],
['title', 'Author']
]);
map.get('name') // "张三"
map.get('title') // "Author"
对象作为键名时,传输的是地址,所以下例中的两个 {name:'曹操'} 虽然长相一样,但实际值不同(存储在堆内存的两个位置)
const map = new Map([
['name', '张三'],
['title', 'Author'],
[{name:'曹操'},'枭雄']
]);
map.get('name') // "张三"
map.get('title') // "Author"
map.get({name:'曹操'});//返回undefined。为什么?因为应用数据类型比较的是地址 {name:'曹操'} !=={name:'曹操'}。
想要obj最为key并且可以获取值,必须以下面形式才行:
let obj = {name:'曹操'};
const map = new Map([obj,'枭雄']);
map.get(obj);//'枭雄'
内部机制:
const items = [
['name', '张三'],
['title', 'Author']
];
const map = new Map();
items.forEach(([key, value],index) => map.set(key,value))
任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构 都可以当作Map构造函数的参数
const set = new Set([
['foo', 1],
['bar', 2]
]);
const m1 = new Map(set);
m1.get('foo') // 1
const m2 = new Map([['baz', 3]]);
const m3 = new Map(m2);
m3.get('baz') // 3