ES6
给我们提供了 Map
数据结构,它类似于对象,用于保存键值对。不同的是,Map
中键的范围不限于字符串类型,各种类型的值(包括对象)都可以当作一个键或一个值。也就是说,Object
结构提供了“字符串—值”的对应,Map
结构提供了“值—值”的对应,是一种更完善的 Hash
结构实现。如果需要用到“键值对”的数据结构,Map
比 Object
更合适。
Map和Object的区别
Object
中的键只能是字符串或者Symbols
类型,但Map
中的键可以是任意值。Map
中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。Map
的键值对个数可以从size
属性获取,而Object
的键值对个数只能手动计算。Object
都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
创建Map
Map
是 ES6
提供给我们的构造函数,本质上是键值对的集合。任何值(对象或者原始值) 都可以作为一个键或一个值。
示例:
我们可以通过 Map()
方法来创建一个空 Map
:
let map = new Map();
console.log(map); // 输出:Map {}
上述代码中,我们可以在创建时初始化 Map
时,Map
可以接收数组作为参数,并且数组成员也是一个个数组,其中包含两个元素,一个表示键,一个表示值。
示例:
例如下面这个 Map
中有两个键值对:
let map = new Map([["name","xkd"],['age','18']]);
console.log(map);
// 输出:Map { 'name' => 'xkd', 'age' => '18' }
第一个键值对中键为 name
,值为 xkd
,第二个键值对中键为 age
,值为 18
。
Map的方法和属性
set()方法
set()
方法用于设置所对应的键值对,然后返回整个 Map
结构,如果已经有值,则键值会被更新,否则就会生成新的键。
示例:
let map = new Map();
map.set('name', 'xkd');
console.log(map); // 输出:Map { 'name' => 'xkd' }
如果要设置多个键值对,则可以执行多次 set
方法。
示例:
例如向 map
中添加三个键值对:
let map = new Map();
map.set('a', 1);
map.set('b', 2);
map.set('c', 3);
console.log(map);
// 输出:Map { 'a' => 1, 'b' => 2, 'c' => 3 }
get()方法
get()
方法用于读取 key
对应的键值,如果找不到 key
,则返回 undefined
。
示例:
下面代码中我们通过 set()
方法为 Map
设置键值对,然后通过 get()
方法获取指定键对应的值:
let map = new Map();
map.set('a', 1);
map.set('b', 2);
map.set('c', 3);
console.log(map.get('a')); // 输出:1
console.log(map.get('b')