一。怎么用
const m = new Map();
console.log(m);//{size: 0}
m.set('a', 1);//添加键、值
m.set('b', 2);
console.log(m);//{'a' => 1, 'b' => 2}
二。和对象比较,对象键一般是字符串;Map的键可以是五种基本型和引用型:对象([],函数,{},set实例,map实例等)
三。方法
1.set方法,添加键值对,如果键已经存在,后添加的键值对覆盖已有的,且可以连续打点调用
注意:这里的覆盖性和set的不允许重复值的区别,不允许重复值是只要已有a成员,不允许出现和a成员全等的成员
2.get方法,参数里面写map实例的键名,返回值是键对应的值,如果参数写了一个map实例中不存在的键名,会返回undefined;
const m = new Map();
console.log(m.set('a', 1));//调用方法返回的是m(已经通过该方法添加过键值对的m)(可以连续打点调用的原因)
console.log(m);//{'a' => 1}
m.set('c', 3).set('b', 2);
console.log(m);//{'a' => 1, 'c' => 3, 'b' => 2}
console.log(m.get('a'));//1
3.forEach方法,有几个键值对,回调函数就被调用几次;
const m = new Map();
m.set('a', 1).set('b', 2);
console.log(m);
m.forEach(function (value, key, map) {
console.log(value, key, map);//第1,2,3个参数分别代表值,键,该map实例,且map和m是同一引用地址
});
打印结果如图:
第二个参数不传时this的情况
'use strict'
const m = new Map([['a', 1], ['b', 2], ['a', 3]]);
m.forEach(function () {
console.log(this);//undefined 这里并没有在use strict下写调用回调函数的代码,因为是forEach是内置方法,forEach里面封装的函数体会调用这个回调函数
//所以只要把定义函数写在use strict下就遵守严格模式this的指向
//程序会看看是谁调用的,再看看函数是不是定义在严格模式下(有没有use strict)再确定函数的this
})
4.has方法:判断是否有这个属性,参数写键名,返回布尔值;
5.delete方法:参数写键名,把该键值对删除,如果写的键名在该实例中不存在,那么什么也不会发生也不会报错;
6.clear方法:清空实例里面的键值对;
四。size属性
实例.szie:返回该实例里有几个键值对
五。Map构造函数的参数(只能传一个参数)
1.数组:只能传二维数组,且必须体现键值对
const m = new Map([['a', 1], ['b', 2], ['c', 3]]);
console.log(m);//{'a' => 1, 'b' => 2, 'c' => 3}
2.set和map实例
const s = new Set([['a', 1], ['b', 2], ['c', 3]]);
console.log(s); { ['a', 1], ['b', 2], ['c', 3] }
const m = new Map(s);
console.log(m);//{'a' => 1, 'b' => 2, 'c' => 3}//和传二维数组同理
const m1 = new Map(m);//参数是map实例时,相当于复制了这个map实例,且地址不同
console.log(m1);//{'a' => 1, 'b' => 2, 'c' => 3}
3.注意:构造函数传递参数添加键值对的方式,同样重复的键会覆盖
const m = new Map([['a', 1], ['b', 2], ['a', 3]]);
console.log(m);//{'a' => 3, 'b' => 2}
六。判断键名是否相同的方式,遵循===,map实例中NaN===NaN