您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# JS中Map和Set的用法及区别是什么
## 目录
1. [引言](#引言)
2. [Map的基本用法](#map的基本用法)
- [创建与初始化](#创建与初始化)
- [常用操作方法](#常用操作方法)
- [遍历方式](#遍历方式)
3. [Set的基本用法](#set的基本用法)
- [创建与初始化](#创建与初始化-1)
- [常用操作方法](#常用操作方法-1)
- [遍历方式](#遍历方式-1)
4. [核心区别对比](#核心区别对比)
- [数据结构本质](#数据结构本质)
- [API差异](#api差异)
- [使用场景](#使用场景)
5. [性能比较](#性能比较)
6. [实际应用案例](#实际应用案例)
- [Map的应用场景](#map的应用场景)
- [Set的应用场景](#set的应用场景)
7. [常见误区](#常见误区)
8. [总结](#总结)
## 引言
在JavaScript的ES6规范中,新增了`Map`和`Set`两种数据结构,它们为开发者提供了更高效的键值对存储和唯一值管理方案。本文将深入解析它们的用法、区别以及实际应用场景。
---
## Map的基本用法
### 创建与初始化
```javascript
// 空Map
const map1 = new Map();
// 带初始值
const map2 = new Map([
['key1', 'value1'],
[2, 'value2']
]);
方法 | 描述 | 示例 |
---|---|---|
set(key, value) |
添加/更新键值对 | map.set('name', 'John') |
get(key) |
获取对应键的值 | map.get('name') |
has(key) |
判断键是否存在 | map.has('name') |
delete(key) |
删除指定键 | map.delete('name') |
clear() |
清空所有键值对 | map.clear() |
size |
获取元素数量(属性非方法) | map.size |
// 遍历键值对
map.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// for...of遍历
for (const [key, value] of map) {
console.log(key, value);
}
// 空Set
const set1 = new Set();
// 带初始值(自动去重)
const set2 = new Set([1, 2, 2, 3]); // 最终存储1,2,3
方法 | 描述 | 示例 |
---|---|---|
add(value) |
添加元素(自动去重) | set.add(4) |
has(value) |
判断值是否存在 | set.has(2) |
delete(value) |
删除指定值 | set.delete(2) |
clear() |
清空所有值 | set.clear() |
size |
获取元素数量(属性非方法) | set.size |
// forEach遍历
set.forEach(value => {
console.log(value);
});
// for...of遍历
for (const value of set) {
console.log(value);
}
特性 | Map | Set |
---|---|---|
存储形式 | 键值对集合 | 唯一值集合 |
键的类型 | 支持任意类型(包括对象) | 直接存储值 |
重复处理 | 键唯一,值可重复 | 所有值必须唯一 |
// Map特有的API
map.keys() // 返回键的迭代器
map.values() // 返回值的迭代器
map.entries() // 返回键值对迭代器
// Set特有的API
set.keys() // 同values()(为保持一致性)
set.values() // 返回值的迭代器
选择Map的情况:
选择Set的情况:
在V8引擎中的表现:
1. 查找效率:
- Map的has()
和Set的has()
均为O(1)复杂度
- 比数组的includes()
(O(n))快10倍以上
set/delete
和Set的add/delete
都是O(1)const nodeMap = new Map();
const div = document.querySelector('div');
nodeMap.set(div, { clickCount: 0 });
div.addEventListener('click', () => {
const meta = nodeMap.get(div);
meta.clickCount++;
});
const cache = new Map();
function deepClone(obj) {
if (cache.has(obj)) return cache.get(obj);
// ...克隆逻辑
cache.set(obj, clone);
return clone;
}
const arr = [1,2,2,3,4,4];
const unique = [...new Set(arr)]; // [1,2,3,4]
const tags = new Set();
tags.add('JavaScript');
tags.add('CSS');
tags.add('JavaScript'); // 自动忽略
// 检查标签是否存在
if (tags.has('HTML')) {
// ...
}
// 正确:使用真正的Map const realMap = new Map(); realMap.set({id:1}, ‘value’); // 支持对象键
2. **忽略遍历顺序**:
```javascript
// Map和Set都保持插入顺序(与普通对象不同)
const map = new Map();
map.set('a', 1);
map.set('b', 2);
[...map.keys()]; // 保证返回['a','b']
维度 | Map | Set |
---|---|---|
核心用途 | 键值对存储 | 唯一值集合 |
键类型 | 任意类型 | 直接存储值 |
重复处理 | 键唯一 | 值唯一 |
典型场景 | 数据关联、复杂键存储 | 去重、集合运算 |
最佳实践建议: 1. 需要键值对关联时优先选择Map而非普通对象 2. 需要保证唯一性时使用Set代替数组 3. 大型数据集合操作时,Map/Set的性能优势更明显 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。