JavaScript 中的 Map

Map 是 JavaScript 中的一种内置对象,它在 ES6(ECMAScript 2015)中被引入,提供了一种新的方式来存储键值对。与传统的对象 ({}) 存储键值对不同,Map 有一些特别的特性,尤其是关于键值类型和插入顺序的保证。

1. Map 的作用:

Map 用来存储键值对,每一对数据是由 组成。Map 提供了一些特别的优势和灵活性:

  • 键的类型:在对象中,键只能是字符串或 Symbol 类型,但在 Map 中,键可以是任何类型,包括对象、函数、甚至是 NaN。这使得 Map 更加灵活。

  • 插入顺序Map 保证键值对的插入顺序,因此我们可以根据插入顺序来遍历 Map。而对象的键是无序的,无法保证插入顺序。

  • 高效的性能Map 在添加、删除、查找键值对时通常比对象更高效,尤其是在大量操作的情况下。

  • 有内置的便利方法Map 提供了一些内置的方法,可以方便地操作键值对(例如,setgethasdeleteclear 等)。

2. 基础用法:

1) 创建 Map

可以通过 new Map() 来创建一个空的 Map,或者通过传入一个二维数组来初始化 Map

let map = new Map();
//或者
let map = new Map([
  ['key1', 'value1'],
  ['key2', 'value2']
]);

2) 设置键值对 (set)

使用 set() 方法将一个键值对添加到 Map 中。如果键已存在,set() 会更新该键对应的值。

let map = new Map();
map.set('name', 'Alice');
map.set('age', 30);
console.log(map);  // Map(2) { 'name' => 'Alice', 'age' => 30 }
3) 获取值 (get)

使用 get() 方法根据键来获取对应的值。如果该键不存在,get() 返回 undefined

let map = new Map();
map.set('name', 'Alice');
console.log(map.get('name'));  // 输出: 'Alice'
console.log(map.get('age'));   // 输出: undefined
4) 检查键是否存在 (has)

使用 has() 方法来检查 Map 中是否存在某个键。

let map = new Map();
map.set('name', 'Alice');
console.log(map.has('name'));  // 输出: true
console.log(map.has('age'));   // 输出: false
5) 删除键值对 (delete)

使用 delete() 方法根据键删除对应的键值对。

let map = new Map();
map.set('name', 'Alice');
map.delete('name');
console.log(map.has('name'));  // 输出: false
6) 清空 Map (clear)

使用 clear() 方法删除 Map 中的所有键值对。

let map = new Map();
map.set('name', 'Alice');
map.set('age', 30);
map.clear();
console.log(map.size);  // 输出: 0 (清空了 Map)
7) 遍历 Map

Map 提供了几种方法来遍历其键值对。

  • 使用 forEach() 方法:

let map = new Map([
  ['name', 'Alice'],
  ['age', 30]
]);

map.forEach((value, key) => {
  console.log(key, value);
});
// 输出:
// name Alice
// age 30
  • 使用 for...of 循环遍历:遍历 Map 时,for...of 循环会返回一个数组形式的键值对。
let map = new Map([
  ['name', 'Alice'],
  ['age', 30]
]);

for (let [key, value] of map) {
  console.log(key, value);
}
// 输出:
// name Alice
// age 30
  • 使用 keys()values()entries()
    • keys() 返回一个包含所有键的迭代器。

    • values() 返回一个包含所有值的迭代器。

    • entries() 返回一个包含所有键值对的迭代器(Map 默认是通过 entries() 方法遍历的)。

let map = new Map([
  ['name', 'Alice'],
  ['age', 30]
]);

console.log([...map.keys()]);   // 输出: ['name', 'age']
console.log([...map.values()]); // 输出: ['Alice', 30]
console.log([...map.entries()]); // 输出: [['name', 'Alice'], ['age', 30]]

3.Map 与 Object 的比较

特性MapObject
键的类型可以是任何类型(包括对象、函数、数字等)只能是字符串或 Symbol 类型
插入顺序保持插入顺序不保证顺序(老版本的 JavaScript 对象是无序的,现代版本的 JavaScript 也有顺序保证)
性能更高效的查找、插入和删除适用于小规模数据,不适合频繁操作大规模键值对
默认键没有默认键Object.prototype 中的默认键(例如 hasOwnProperty
迭代方式支持直接迭代、forEach()keys()values()不支持直接迭代,必须手动迭代 Object.keys()

4.何时使用 Map

  • 当需要键值对的插入顺序时。

  • 当需要使用非字符串类型的键时。

  • 当需要频繁添加、删除或查找键值对时,Map 的性能更优。

  • 当需要确保键值对的顺序时。

5.总结

Map 是 JavaScript 中非常强大的一个数据结构,尤其适用于存储键值对,提供了更多的灵活性和性能上的优势。它比传统的对象({})在处理复杂数据时更具优势,尤其是在涉及大量数据时,Map 的查找、删除和插入操作比对象更加高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值