zoukankan      html  css  js  c++  java
  • JavaScript学习-Map

    一、含义和基本用法

      JavaScript 的对象(Object ) 本质上都是键值对的集合(Hash) ,但是它只能使用 字符串来作为键,这给它的使用带来了很大的限制。

    const data = {}
    const element = document.getElementById('myDiv');
    data[element] = 'metadate';
    data['[Object HTMLDivElement]']  // 'metadate'

      上面的代码原意是将获取的 DOM 元素作为键,但是由于 Object 只能接受字符串作为键,所以他会把 dom 元素转为一个字符串。

      为了解决这种问题,ES6 提供了 Map 数据结构,它类似于对象,但是它的 ‘键’ 是不仅只限于字符串,各种类型的值都可以作为 ‘键’ ,包括对象也可以作为它的键 ,也就是说,Object 提供了一个 ’字符串-值‘的对应关系,而 Map 提供了一种 ’值-值‘的数据结构,

      可以使用 new Map 来创建一个 Map 实例,可以传递一个表示键值对的数组作为参数,如下:

    const map = new Map([
      [ 'name': 'zhagnsan' ],
      ['title':'author']
    ])

      Map 构造函数接受数组作为参数,其实执行的是下面的算法:

    const items = [
        ['name', 'zhangsan'],
        ['titel', 'author']
    ]
    const map = new Map()
    items.forEach(([key, value]) => map.set(key, value))

      不只是只有数组才可以作为参数,只要是具有 Iterator 接口并且每一个成员都是一个双元素数据的数据结构都可以作为 map 构造函数的参数,也就是说,Set 和 map 都可以用来生成新的 map

      注意:只有对同一对象的引用,Map 才会将它当作一个键

    const map = new Map()
    
    map.set(['a'], 555) 
    map.get(['a']) // undefined

      上面虽然是看起来是同一个键,但是实际上却是两个值,因为内存地址是不一样的,同样,同样的两个值的两个实例在Map 结构中也会被视为两个键,如下:

    const map = new Map()
    const k1 = ['a']
    const k2 = ['a']
    map.set(k1, 111).set(k2, 222)
    map.get(k1) // 111
    map.get(k2) // 222

      由上面可以知道,Map 的键实际上是和内存地址绑定的,只要内存地址不一样,就会被视为两个键,这就解决了同名属性碰撞的问题,当我们扩展别人的 库的时候,如果使用对象作为键名,不用担心自己的属性和原作者的属性同名。

      如果Map 的键是一个基本类型的值,则只要两个值严格相等,Map 就会将其视为一个键,包括0 和-0,另外虽然NaN不严格等于本身,但是 Map 将其视为同一个键。

    二、实例的属性和方法

      具体可以查看:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map

    三、与其他数据结构的相互转化

    Map转为数组:Map转为数组最方便的方法就是使用扩展运算符(...)

    const map = new Map().set(true, 7).set({ foo: '3' }, ['abc'])
    console.log([...map]) // [ [ true, 7 ], [ { foo: '3' }, [ 'abc' ] ] ]

    数组转为Map:将数组传入Map 的构造函数作为参数就可以了

    const map=new Map([[true,7],[{foo:3},['abc']]])
    console.log(map) // { true => 7, { foo: 3 } => [ 'abc' ] }

    Map转为对象:只要是map对象的健是字符串就可以将map转为对象了

    function strMapToObj(strMap){
      let obj=Object.create(null);
      for(let [k,v] of strMap){
        obj[k]=v;
      }
      return obj;
    }
    
    const myMap=new Map().set('yes',true).set('no',false)
    const obj=strMapToObj(myMap)
    console.log(obj) // { yes: true, no: false }

    Map转为JSON,有两种情况:

      一种是map的健是字符串,可以将它转为对象JSON

    function strMapToJson(strMap){
      return JSON.stringify(strMapToJson(strMap))
    }
    let myMap=new Map().set('yes',true).set('no',false);
    const json=setMapToJson(myMap)
    console.log(json)

      一种是map的健不是字符串,可以将它转为数组JSON:

    function mapToArrayJson(map){
      return JSON.stringify([...map])
    }
    let myMap=new Map().set(true,7).set({foo:3},['abc'])
    const json=mapToArrayJson(myMap)
    console.log(json) // [[true,7],[{"foo":3},["abc"]]]
  • 相关阅读:
    C#基础
    进制转换
    养猪和存储空间
    独热码和二进制码
    mux_xz
    饮料机
    亚稳态
    mos管功耗
    功能覆盖率和代码覆盖率
    时序逻辑电路输出特点
  • 原文地址:https://www.cnblogs.com/zhilili/p/14761869.html
Copyright © 2011-2022 走看看