定义:Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
语法:
new Map([iterable]);
参数:
iterable
Iterable 可以是一个数组或者其他 iterable 对象,其元素为键值对(两个元素的数组,例如: [[ 1, ‘one’ ],[ 2, ‘two’ ]])。 每个键值对都会添加到新的 Map。null 会被当做 undefined。
属性:
Map.length 属性 length 的值为 0 。
两种Map的格式
//定义Map第一种格式
{
let map = new Map();
let arr = ['123'];
map.set(arr,456); //set()添加元素 注意和Set区分]
//获取某一个元素使用 get()
console.log('map',map,map.get(arr)); //{Array(1) => 456} 456
}
//定义Map第二种格式
{
let map = new Map([['a',123],['b',456]]); //格式 key,value
console.log('map args',map); // {"a" => 123, "b" => 456}
}
示例
使用Map对象
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 () {}
Map常用属性和方法
//Map常用属性和方法
{
let map = new Map([['a',123],['b',456]]); //格式 key,value
//size
console.log('size',map.size); // size 2
//delete()
console.log('delete',map.delete('a'),map); //{"b" => 456}
//clear()
console.log('delete',map.clear(),map); //{}
}
WeakMap与Map的区别
//1. WeakMap的数据类型只支持对象,WeakMap的对象是弱引用
//2. Map的一些属性和方法WeakMap是没有的
{
let weakmap = new WeakMap();
let o = {};
weakmap.set(o,123);
console.log(weakmap.get(o)); //123
}
Map遍历
//Map遍历
{
//使用 for..of 方法迭代 Map
let myMap = new Map();
myMap.set(0,'zero');
myMap.set(1,'one');
console.log(myMap); //{0 => "zero", 1 => "one"}
console.log(myMap.get(0)); //zero
for(let [key,value] of myMap) {
console.log(key + "=" + value); // 0=zero 1=one
}
// 将会显示两个log。一个是"0 = zero"另一个是"1 = one"
for(let key of myMap.keys()) {
console.log('key',key);
// 将会显示两个log。 一个是 "0" 另一个是 "1"
}
for(let value of myMap.values()) {
console.log('value',value);
// 将会显示两个log。 一个是 "zero" 另一个是 "one"
}
for(let [key,value] of myMap.entries()) {
console.log(key + "=" + value);
// 将会显示两个log。 一个是 "0 = zero" 另一个是 "1 = one"
}
//使用 forEach() 方法迭代 Map
myMap.forEach((value,key) => { //vaule代表键值 key代表键名 按照参数顺序
console.log(key + "=" + value);
// 将会显示两个logs。 一个是 "0 = zero" 另一个是 "1 = one"
})
myMap.forEach((item) => { // item代表键值
console.log(item);
// 将会显示两个logs。 一个是 "zero" 另一个是 "one"
})
}
将NaN作为Map的键
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"); //NaN
myMap.get(otherNaN); // "not a number"