深入理解 JavaScript 中的 Map() 和 Set()

178 阅读3分钟

JavaScript 中的 Map 和 Set 是 ES6 引入的两个强大的数据结构,它们提供了更灵活、高效的数据存储和检索方式。在这篇文章中,我们将深入探讨 Map 和 Set 的特性、用法以及它们与传统对象和数组的对比。

1. Map 的基础

Map 是一种键值对的集合,其中键和值可以是任意数据类型。相对于传统的对象,Map 提供了更灵活的键值对关系,并且不受类型限制。

1.1 创建和初始化

// 创建一个空的 Map
const myMap = new Map();

// 使用数组初始化 Map
const initialMap = new Map([
  ['key1', 'value1'],
  ['key2', 'value2'],
  ['key3', 'value3']
]);

// 获取 Map 的大小
console.log(initialMap.size); // 输出 3

1.2 添加和获取元素

const myMap = new Map();

myMap.set('key1', 'value1');
myMap.set('key2', 'value2');

console.log(myMap.get('key1')); // 输出 'value1'
console.log(myMap.get('key3')); // 输出 undefined

1.3 遍历 Map

const myMap = new Map([
  ['key1', 'value1'],
  ['key2', 'value2'],
  ['key3', 'value3']
]);

// 遍历键
for (const key of myMap.keys()) {
  console.log(key);
}

// 遍历值
for (const value of myMap.values()) {
  console.log(value);
}

// 遍历键值对
for (const entry of myMap.entries()) {
  console.log(entry[0], entry[1]);
}

2. Set 的基础

Set 是一种无重复值的集合,它不允许相同的值出现多次。Set 提供了简单而高效的方法来存储和检索唯一的值。

2.1 创建和初始化

// 创建一个空的 Set
const mySet = new Set();

// 使用数组初始化 Set
const initialSet = new Set([1, 2, 3, 4, 5]);

// 获取 Set 的大小
console.log(initialSet.size); // 输出 5

2.2 添加和获取元素

const mySet = new Set();

mySet.add(1);
mySet.add(2);

console.log(mySet.has(1)); // 输出 true
console.log(mySet.has(3)); // 输出 false

2.3 遍历 Set

const mySet = new Set([1, 2, 3, 4, 5]);

// 遍历值
for (const value of mySet) {
  console.log(value);
}

3. Map vs. Object

3.1 键的类型

在 Map 中,键可以是任意数据类型,包括对象、函数等。而在对象中,键只能是字符串或者 Symbols。

const myMap = new Map();
const obj = {};

myMap.set(obj, 'value'); // 正常运行

const myObj = {};
myObj[obj] = 'value'; // 键会被转换成字符串 "[object Object]"

3.2 键值对的顺序

在 Map 中,键值对的顺序是插入顺序。而在对象中,键值对的顺序不一定是插入顺序。

const myMap = new Map();
const myObj = {};

myMap.set('a', 1);
myMap.set('b', 2);
myMap.set('c', 3);

for (const entry of myMap.entries()) {
  console.log(entry[0], entry[1]);
}
// 输出:
// a 1
// b 2
// c 3

const obj = { a: 1, b: 2, c: 3 };
for (const key in obj) {
  console.log(key, obj[key]);
}
// 输出顺序不确定

4. Set vs. Array

4.1 唯一性

Set 中的值是唯一的,不允许重复。而数组中的元素可以重复出现。

const mySet = new Set();
const myArray = [1, 2, 2, 3, 4, 4, 5];

mySet.add(1).add(2).add(3).add(4).add(5);

console.log([...mySet]); // 输出 [1, 2, 3, 4, 5]
console.log([...new Set(myArray)]); // 输出 [1, 2, 3, 4, 5]

4.2 数组方法 vs. Set 方法

Set 提供了一些数组不具备的方法,比如 adddeletehas 等。

const mySet = new Set([1, 2, 3, 4, 5]);
const myArray = [1, 2, 3, 4, 5];

mySet.add(6);
console.log([...mySet]); // 输出 [1, 2, 3, 4, 5, 6]

mySet.delete(3);
console.log([...mySet]); // 输出 [1, 2, 4, 5, 6]

console.log(myArray.indexOf(3) !== -1); // 输出 true

5. 总结

Map 和 Set 提供了 JavaScript 中更加灵活、高效的数据存储和检索方式。它们分别适用于不同的场景,Map 适用于需要键值对映射的情况,而 Set 适用于需要存储唯一值的情况。深入理解这两种数据结构,有助于开发者更好地选择和应用它们,提高代码的效率和可维护性。希望本文能够帮助读者更好地掌握 Map 和 Set 的基本概念和用法。