发现宝藏
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。
Map
是 ES6 中引入的一种新的数据结构,它类似于对象(Object
),但与对象相比,Map
提供了更多的灵活性和功能。Map
用来存储键值对(key-value pairs),并且它的键可以是任何类型,而不仅仅是字符串或符号。相较于普通对象,Map
在很多方面提供了更好的性能和更方便的API。
基本概念
Map
是一种集合(collection),其中每个元素都由一个键(key)和一个值(value)组成。- 在
Map
中,键和值都是任意类型的,比如:对象、函数、数组等。 - 与普通对象不同,
Map
中的键值对是有序的,即插入的顺序会被保存下来。
创建 Map
实例
let myMap = new Map(); // 创建一个空的 Map 实例
你也可以在创建时直接传入一个二维数组(数组的每个元素是一个由键值对组成的数组)来初始化 Map
:
let myMap = new Map([
['name', 'Alice'],
['age', 25],
['job', 'developer']
]);
常用方法
1. .set(key, value)
set
方法用于向 Map
添加新的键值对。如果键已经存在,则会更新该键对应的值。
let map = new Map();
map.set('name', 'Alice');
map.set('age', 25);
map.set('job', 'developer');
console.log(map);
// Map(3) { 'name' => 'Alice', 'age' => 25, 'job' => 'developer' }
2. .get(key)
get
方法用于根据键获取对应的值。如果该键不存在,返回 undefined
。
console.log(map.get('name')); // 输出 'Alice'
console.log(map.get('address')); // 输出 undefined
3. .has(key)
has
方法检查 Map
中是否存在某个键,返回 true
或 false
。
console.log(map.has('name')); // 输出 true
console.log(map.has('address')); // 输出 false
4. .delete(key)
delete
方法用于删除 Map
中指定键值对。如果该键存在,返回 true
,否则返回 false
。
map.delete('age');
console.log(map.has('age')); // 输出 false
5. .clear()
clear
方法用于删除 Map
中的所有键值对。
map.clear();
console.log(map.size); // 输出 0
6. .size
size
是一个属性,用来获取 Map
中键值对的数量。
let map = new Map();
map.set('name', 'Alice');
map.set('age', 25);
console.log(map.size); // 输出 2
7. .keys()
, .values()
, .entries()
这些方法分别返回 Map
中所有键、所有值、所有键值对的迭代器。
.keys()
返回一个迭代器,包含Map
中的所有键。.values()
返回一个迭代器,包含Map
中的所有值。.entries()
返回一个迭代器,包含Map
中的所有键值对。
let map = new Map([
['name', 'Alice'],
['age', 25]
]);
// 获取所有键
for (let key of map.keys()) {
console.log(key); // 输出 'name', 'age'
}
// 获取所有值
for (let value of map.values()) {
console.log(value); // 输出 'Alice', 25
}
// 获取所有键值对
for (let [key, value] of map.entries()) {
console.log(key, value); // 输出 'name' 'Alice', 'age' 25
}
8. .forEach(callback)
forEach
方法用于遍历 Map
中的所有键值对,参数是一个回调函数,该函数接收三个参数:value
、key
、map
。
let map = new Map([
['name', 'Alice'],
['age', 25]
]);
map.forEach((value, key) => {
console.log(key, value);
});
// 输出:
// name Alice
// age 25
特点总结
- 键可以是任意类型:
Map
的键可以是任何数据类型,包括对象、数组、函数等。 - 插入顺序:
Map
会保持键值对的插入顺序,可以通过.keys()
、.values()
、.entries()
获取到有序的迭代结果。 - 性能优势:相比于对象,
Map
在频繁的增删查改操作中通常表现得更好,因为Map
是为存储键值对而优化的,而对象更多是为了属性访问而设计。 - 大小和删除:
Map
具有.size
属性,可以随时查询元素的数量;并且可以通过.delete()
删除单个元素,或者使用.clear()
删除所有元素。 - 更方便的 API:
Map
提供了许多方便的内建方法,能够使得对键值对的操作更加灵活和高效。
与对象的区别
- 键类型:对象的键只能是字符串或符号,而
Map
的键可以是任意类型。 - 顺序:
Map
会保留元素的插入顺序,而对象的键并不保证有序。 - 性能:
Map
的性能通常更优,尤其是在频繁操作键值对时。
使用场景
Map
适合用于以下情况:
- 需要频繁对键值对进行增删改查操作。
- 键的类型不止是字符串或符号。
- 需要保持插入顺序,或者需要知道元素的个数。