ES6的Map结构

JavaScript对象(Object),本质上市键值对的集合(Hash结构),但是key值只能是字符串,如果用一个对象作为key值,将被转化为"[Object,Object]";

Map结构就是为了解决这个问题的,类似于对象,也是键值对的集合,但是它的键可以是各种类型(包括对象)。

Object结构提供了“字符串-值”的对应关系,Map结构提供了“值-值”的对应。

Map结构方法:set设置,get获取,delete删除,clear清空。

let m1 = new Map();
let o = {p:"hello world!"}
m1.set(o,'content')
m1.get(o) //'content'
m1.has(o) //true
m1.delete(o) //true
m1.has(o) //false
 
const m2 = new Map([
['name','miya'],
['age',26]
])
m2.has('name') //true
 

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对象,可以采用链式的写法

     let map = new Map().set(1,'a').set(2,'b').set(3,'c')

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的方法了。

 

posted @ 2018-05-10 16:59  tangjiao_Miya  阅读(351)  评论(0编辑  收藏  举报