JavaScript 标准之 Map对象

前言

一直以来使用数组和对象来定义数据模型,前几天在翻阅ES6语法的时候,突然发现有一种Map对象对操作键值对特别好用,而且代码更简洁明了。对数据操纵方法多一种解决问题的方法,这是ECMA 6 新增的数据结构

定义

Map对象保存键/值对,是键/值对的集合。任何值(对象或者原始值) 都可以作为一个键或一个值。Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应。

语法

mapobj = new Map([iterable])

iterable 可以是一个数组或者其他iterable 对象,其元素或为键值对,或为两个元素的数组。 每个键值对都会添加到新的 Map。null 会被当做 undefined。

集合中的键和值可以是任何类型。如果使用现有键向集合添加值,则新值会替换旧值。

Object 和 Map 对象的对比

相似点: 都允许你按键存取一个值、删除键、检测一个键是否绑定了值。

不同点:

1. 一个对象的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值,包括函数、对象、基本类型。

2.Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map对象是按插入的顺序返回键值。

3. 通过 size 属性直接获取一个 Map 的键值对个数,而 Object 的键值对个数只能手动计算。

4. Map 是可迭代的,而 Object 的迭代需要先获取它的键数组然后再进行迭代。

5. Object 都有自己的原型,所以原型链上的键名有可能和对象上的键名产生冲突。虽然 ES5 开始可以用 map = Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。

6. Map 在频繁增删键值对的场景下会有些性能优势。

属性

构造函数
    指定创建映射的函数。
Prototype — 原型(Map.prototype)
    为映射返回对原型的引用。表示Map构造器的原型。允许添加属性从而应用于所有的Map对象。
size(Map.length)
    返回映射中的元素数。

方法

clear
    从映射中移除所有元素。
delete
    从映射中移除指定的元素。
forEach
    对映射中的每个元素执行指定操作。
get
    返回映射中的指定元素。
has
    如果映射包含指定元素,则返回 true。
set
    添加一个新建元素到映射。
toString
    返回映射的字符串表示形式。
valueOf
    返回指定对象的原始值。
// Map对象类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
        let a = new Map();
        let b = 'ff';
        a.set(b, {p: 'hello'})
        console.log(a);
        console.log(a.get(b));

        console.log(a.has(b));
        console.log(a.delete(b));
        console.log(a.has(b));

        // 作为构造函数,Map也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
        let a = new Map([
            ['first', 'aaaaa'],
            ['second', 'bbbbbbb']
        ]);
        
        console.log(a.size);

        // 如果对同一个键多次赋值,后面的值将覆盖前面的值。
        let a = new Map();
        a.set(1, 'aaa');
        a.set(1, 'bbb');
        console.log(a.get(1));   //bbb
   
    //    如果读取一个未知的键,则返回undefined。!!!注意,只有对同一个对象的引用,Map结构才将其视为同一个键。Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。
       let a = new Map();
        console.log(a.get('abc'))   //undefined
        a.set(['a'], 555)
        console.log(a.get(['a']))   //undefined

        const k1 = ['a']
        const k2 = ['a']

        a.set(k1, 111)
        a.set(k2, 222)
        console.log(a.get(k1))   //111
        console.log(a.get(k2))   //222


        // Map.clear() 方法清除所有成员,没有返回值
        let map = new Map();
        map.set('foo', true)
        map.set('bar', true)

        console.log(map.size);        //2
        console.log(map.clear());    //undefined
        console.log(map.size);      //0


        let map = new Map([
            ['first', 'aaaaa'],
            ['second', 'bbbbbbb']
        ]);

        for(let key of map.keys()){
            console.log(key);           //first second
        }
        for(let value of map.values()){
            console.log(value);         //aaaaa bbbbbbb
        }

        for(let item of map.entries()){
            console.log(item[0], item[1]);  //first aaaaa second bbbbbbb
        }
        // 等同使用map.entries()
        for(let [key,value] of map){
            console.log(key, value);        first aaaaa second bbbbbbb
        }
        
        // 数据结构可以使用扩展运算符(...)
        console.log([...map.keys()]);等

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值