javascript 中的 map 完全指南
引言
在 javascript 中,map 是一种用于存储键值对的数据结构,具有灵活的键类型和丰富的方法。相较于传统的对象(object),map 提供了更高效的键值对操作方式,特别适合处理大量数据和需要频繁操作键值对的场景。本文将详细介绍 map 的创建、常用方法、迭代方式,并探讨它与对象的区别和实际应用场景。
1. 创建 map
使用 new map() 来创建一个空的 map。
const map = new map();
也可以在创建时初始化 map,传入一个包含键值对的数组:
const map = new map([
["name", "alice"],
["age", 25]
]);
console.log(map); // 输出 map(2) { 'name' => 'alice', 'age' => 25 }2. map 和对象的对比
在学习 map 的基本操作之前,我们先来看一下 map 与传统对象的区别。
| 特性 | map | 对象 |
|---|---|---|
| 键的类型 | 任何类型(字符串、对象、函数等) | 只能是字符串或符号 |
| 插入顺序 | 保持插入顺序 | 不保证插入顺序 |
| 键值对数量 | size 属性 | 手动计算(object.keys().length) |
| 原型链污染 | 无 | 有,继承 object.prototype |
| 适用场景 | 频繁操作键值对,大量数据 | 小规模键值对或需要方法时 |
通过对比可以看出,map 在键的类型、插入顺序的保持以及键值对操作的效率上,都有显著的优势。
3. map 的常用方法
3.1 set(key, value)
用于向 map 添加一个键值对。如果键已经存在,set 会更新其值。
map.set("name", "bob");
map.set("age", 30);
console.log(map); // 输出 map(2) { 'name' => 'bob', 'age' => 30 }3.2 get(key)
获取指定键的值,如果键不存在,返回 undefined。
console.log(map.get("name")); // 输出 'bob'
console.log(map.get("gender")); // 输出 undefined3.3 has(key)
检查 map 中是否存在指定的键,返回 true 或 false。
console.log(map.has("name")); // 输出 true
console.log(map.has("gender")); // 输出 false3.4 delete(key)
删除指定的键值对,返回 true 如果成功删除,否则返回 false。
map.delete("age");
console.log(map); // 输出 map(1) { 'name' => 'bob' }3.5 clear()
清空 map,删除所有键值对。
map.clear();
console.log(map); // 输出 map(0) {}3.6 size
返回 map 中键值对的数量。
map.set("name", "alice");
map.set("age", 25);
console.log(map.size); // 输出 24. map 的迭代方法
map 支持多种迭代方法,可以轻松遍历其中的键值对。
4.1 foreach(callback)
遍历 map 中的每一个键值对,callback 函数接受三个参数:值、键、map 本身。
map.foreach((value, key) => {
console.log(`${key}: ${value}`);
});
// 输出:
// name: alice
// age: 254.2 keys()
返回 map 中所有键的迭代器(iterator),可以用 for...of 来遍历。
for (let key of map.keys()) {
console.log(key);
}
// 输出:
// name
// age4.3 values()
返回 map 中所有值的迭代器(iterator)。
for (let value of map.values()) {
console.log(value);
}
// 输出:
// alice
// 254.4 entries()
返回 map 中所有键值对的迭代器,每个键值对会以 [key, value] 的形式返回。
for (let entry of map.entries()) {
console.log(entry);
}
// 输出:
// [ 'name', 'alice' ]
// [ 'age', 25 ]4.5 使用 for...of 遍历 map
可以直接用 for...of 遍历 map,默认会调用 entries() 方法,因此会返回 [key, value] 的数组。
for (let [key, value] of map) {
console.log(`${key}: ${value}`);
}
// 输出:
// name: alice
// age: 255. map 的应用场景
map 是一种适合存储键值对的结构,尤其适用于以下场景:
需要使用非字符串类型的键:对象的键只能是字符串或符号,而 map 可以使用任意数据类型作为键,比如对象、函数等。
const objkey = { id: 1 };
const map = new map();
map.set(objkey, "object as key");
console.log(map.get(objkey)); // 输出 'object as key'- 需要频繁操作键值对:
map在键值对的查找、插入、删除操作上比对象性能更好,适合在频繁操作键值对的场景下使用。 - 需要保持插入顺序:
map会按照插入的顺序存储键值对,因此在遍历时顺序是固定的,而对象则不保证插入顺序。 - 避免原型链污染:对象的键可能会受
object.prototype影响,而map没有原型链污染问题,可以安全地存储任意键。
6. 使用 map 统计字母出现的次数
我们可以通过一个例子来比较使用 map 和不使用 map 的差别。假设我们有一个字符串,需要统计其中每个字母出现的次数。map 非常适合这种键值对存储的场景。
方法 1:不用 map,使用普通对象
function countletterswithobject(str) {
const lettercounts = {}; // 用对象存储字母出现的次数
for (let letter of str) {
if (lettercounts[letter]) {
lettercounts[letter]++;
} else {
lettercounts[letter] = 1;
}
}
return lettercounts;
}
const result = countletterswithobject("hello world");
console.log(result); // 输出: { h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }方法 2:使用 map
function countletterswithmap(str) {
const lettercounts = new map(); // 用 map 存储字母出现的次数
for (let letter of str) {
if (lettercounts.has(letter)) {
lettercounts.set(letter, lettercounts.get(letter) + 1);
} else {
lettercounts.set(letter, 1);
}
}
return lettercounts;
}
const resultmap = countletterswithmap("hello world");
console.log(resultmap); // 输出: map(7) { 'h' => 1, 'e' => 1, 'l' => 3, 'o' => 2, 'w' => 1, 'r' => 1, 'd' => 1 }7. weakmap 简介
weakmap 是 map 的一种特殊类型,它的键必须是对象,且是弱引用(即不会阻止对象被垃圾回收)。如果某个对象在其他地方不再被引用,那么即使它是 weakmap 的键,也会被垃圾回收,这样可以防止内存泄漏。
weakmap的特点 只接受对象作为键,不支持基本类型。- 键是弱引用,不会阻止垃圾回收。
- 没有
size属性、clear方法和遍历方法(foreach、keys、values、entries),因此不能遍历weakmap。
使用场景
weakmap 通常用于私有属性或私有数据的存储,不希望这些数据影响垃圾回收。它适用于对象间的临时映射关系,且在数据无需遍历的情况下使用。
const weakmap = new weakmap();
let obj = { id: 1 };
weakmap.set(obj, "some value");
console.log(weakmap.get(obj)); // 输出 'some value'
obj = null; // 删除对象的其他引用
// 在此之后,obj 被垃圾回收,weakmap 中的键值对也会被清除总结
map 是一种强大的键值对数据结构,具有灵活的键类型支持、保持插入顺序、丰富的内置方法等优势,适合存储和操作大量键值对。而 weakmap 则是一种针对对象键的弱引用 map,在特定场景中帮助管理内存。希望这些内容能帮助你全面理解和应用 map!
到此这篇关于javascript 中的 map使用指南的文章就介绍到这了,更多相关js map使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论