ES6的Map结构
JavaScript对象(Object),本质上市键值对的集合(Hash结构),但是key值只能是字符串,如果用一个对象作为key值,将被转化为"[Object,Object]";
Map结构就是为了解决这个问题的,类似于对象,也是键值对的集合,但是它的键可以是各种类型(包括对象)。
Object结构提供了“字符串-值”的对应关系,Map结构提供了“值-值”的对应。
Map结构方法:set设置,get获取,delete删除,clear清空。
Map也可以接受一个数组(成员是一个个的键值对)作为参数。
let items = [ ["name","miya"], ["age",26] ]; let m2 = new Map(); items.forEach(([key,value])=>{ m2.set(key,value); })
实际上执行的上面的算法。
如果重复赋值,例如:
const m3 = new Map(); m3.set(1,'aaa').set(1,'bbb'); m3.get(1); //"bbb"
注意:当使用对象作为key值时候,使用get方法里面的参数是引用,所以看下面:
const m4 = new Map(); let foo = {x:1}; let bar = foo; m4.set(foo,'origin'); console.log(m4.get(bar)) //origin
Map的键值是跟内存地址绑定的,只要内存地址不同,就被视为两个键,如果两个变量都指向同一个内存,则get到的值是相同。
这样子就解决了同名属性碰撞的问题,就算两个变量值相同,但是指向的地址不同,所以还是两个key。
如果使用简单类型(数字,字符串,布尔值)作为键呢?只要两个值严格相等(===),就视为一个键。
let m5 = new Map(); m5.set(+0,123); m5.get(-0); //123 m5.set(true,1); m5.set("true",2); m5.get(true); //1 m5.set(undefined,3); m5.set(null,4); m5.get(undefined) //3 m5.set(NaN,123); m5.get(NaN) //123
Map实例的属性和方法:
1,size : 返回Map结构的成员总数。 例如m5.size //3
2,set(key,value),返回的当前的Map对象,可以采用链式的写法
3,get(key) //返回键值
4,has(key) //判断键是否存在
5,delete(key) //删除某个键
6,clear() //清除所有成员,没有返回值。map.clear()
Map的遍历方法:
let o = {x:1} let map = new Map([ [1,'a'], ['false','bb'], [o,'content'], [true,'ccc'] ]); [...map.keys()]; // [1, "false", {…}, true]
[...map.values()]; //["a", "bb", "content", "ccc"]
[...map.entries()] 和 [...map]都可以很快的将map结构转化为Array结构
结合数组的map,filter方法可以实现Map的遍历和过滤(Map本身是没有map和filter方法);
Map有forEach方法,类似数组的forEach也可实现遍历。
数组和Map之间的转化,前面已经提过了,那么Map和对象互相转化?Map和JSON互相转化?
Map和对象互相转化,就是遍历键值对进行空对象或者空Map的填入。
Map和JSON互相转化:
1,Map转化为JSON,先将Map转化为数组,即:JSON.stringify([...map]);
2,JSON转化为Map,正常情况所有键名都是字符串,所以就是对象转Map的方法了。