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的遍历方法:

猜你喜欢

转载自www.cnblogs.com/tangjiao/p/9020541.html
今日推荐