最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 快来围观Map啦

    正文概述 掘金(_乘风_)   2021-08-10   352

    Map

    • Map结构类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
    • Object 结构提供了“字符串—值”的对应
    • Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现

    用法

    • 作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个``表示键值对的数组
    const map = new Map([
      ['name', '张三'],
      ['title', 'Author']
    ]);
    
    map.size // 2
    map.has('name') // true
    map.get('name') // "张三"
    map.has('title') // true
    map.get('title') // "Author"
    
    • 任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。
    • 也就是说,SetMap都可以用来生成新的 Map。
    const set = new Set([
      ['foo', 1],
      ['bar', 2]
    ]);
    const m1 = new Map(set);
    m1.get('foo') // 1
    
    const m2 = new Map([['baz', 3]]);
    const m3 = new Map(m2);
    m3.get('baz') // 3
    
    • 如果对同一个键多次赋值,后面的值将覆盖前面的值。
    • 如果读取一个未知的键,则返回undefined
    • 注意: 只有对同一个对象的引用,Map 结构才将其视为同一个键
    const map = new Map();
    
    map.set(['a'], 555);
    map.get(['a']) // undefined
    

    上述代码中:setget方法,表面是针对同一个键,但实际上这是两个不同的数组实例,内存地址是不一样的,因此get方法无法读取该键,返回undefined

    • 同样的值的两个实例,在 Map 结构中被视为两个键。
    • 总的来说:Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键
    • 虽然NaN不严格相等于自身,但 Map 将其视为同一个键。
    • undefinednull也是两个不同的键。

    方法

    • Map.prototype.set(key, value): 用来设置Map结构的一个键值对,然后返回整个 Map 结构。

      • 如果key已经有值,则键值会被更新,否则就新生成该键。
      • set方法返回的是当前的Map对象,因此可以采用链式写法。
    • Map.prototype.get(key): 读取key对应的键值,如果找不到key,返回undefined

    • Map.prototype.has(key): 判断Map结构中是否包含key键,返回一个布尔值。

    • Map.prototype.delete(key): 删除Map结构的中key键,返回true,如果删除失败,则返回false。

    • Map.prototype.size(): 获取Map结构中的键值对的数量。

    • Map.prototype.clear()清除所有成员,没有返回值

    • Map.prototype.keys():返回键名的遍历器。

    • Map.prototype.values():返回键值的遍历器。

    • Map.prototype.entries():返回所有成员的遍历器。

    • Map.prototype.forEach():遍历 Map 的所有成员,该方法还可以接受第二个参数,用来绑定``this

    注意: Map 的遍历顺序就是插入顺序。

    与其他结构的相互转换

    • Map转为数组:使用扩展运算符
    const myMap = new Map()
      .set(true, 7)
      .set({foo: 3}, ['abc']);
    [...myMap]
    // [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]
    
    • 数组转为Map:将其直接传入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);
    strMapToObj(myMap)
    // { yes: true, no: false }
    
    • 对象转为Map:可以通过Object.entries()
    let obj = {"a":1, "b":2};
    let map = new Map(Object.entries(obj));
    
    // 第二种方式 自写
    function objToStrMap(obj) {
      let strMap = new Map();
      for (let k of Object.keys(obj)) {
        strMap.set(k, obj[k]);
      }
      return strMap;
    }
    
    objToStrMap({yes: true, no: false})
    // Map {"yes" => true, "no" => false}
    
    • Map转为JSON:
      1. Map 的键名都是字符串,这时可以选择转为对象 JSON。
      2. Map 的键名有非字符串,这时可以选择转为数组 JSON。
    • JSON 转为Map:
      1. 所有键名都是字符串。
      2. 整个 JSON 就是一个数组,且每个数组成员本身,又是一个有两个成员的数组:这时,它可以一一对应地转为 Map。这往往是 Map 转为数组 JSON 的逆操作。

    WeakMap

    • WeakMap结构与Map结构类似,也是用于生成键值对的集合。
    • 与Map的区别:
      • WeakMap只接受对象作为键名null除外),不接受其他类型的值作为键名。
      • WeakMap的键名所指向的对象,不计入垃圾回收机制。
    • WeakMap的专用场合就是,它的键所对应的对象,可能会在将来消失。WeakMap结构有助于防止内存泄漏。
    • WeakMap 的另一个用处是部署私有属性。
    • 注意:WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。

    方法

    • 只有 get()set()has()delete()
    • 没有遍历方法。
    • 不支持 clear 方法。

    下载网 » 快来围观Map啦

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元