zoukankan      html  css  js  c++  java
  • 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的方法了。

  • 相关阅读:
    python thrift
    redis 知识点
    Spring其他注解和xml配置(不常用的)
    Spring常用的的注解以及对应xml配置详解
    Eureka的工作原理简介
    SpringBoot的自动配置实现和介绍
    SpringBoot多配置文件,切换环境
    数据卷介绍和常用的服务部署
    Spring Security简介
    在Java中入门,读取和创建Excel,Apache POI的使用
  • 原文地址:https://www.cnblogs.com/tangjiao/p/9020541.html
Copyright © 2011-2022 走看看