1、set
set是一种集合类型,用于存储一组唯一的值。不允许重复的值
创建set
const set = new Set();
set.add(1);
set.add(2);
set.add(2); // 不会添加,因为 2 已经存在
set.add(3);
console.log(set); // 输出: Set { 1, 2, 3 }
Set 的特点
- 唯一性:
Set中的每个元素都是唯一的,重复的元素会被自动忽略。 - 无序:
Set中的元素是无序的,不能通过索引访问元素,必须通过迭代来访问。 - 可迭代:
Set是可迭代的,可以使用for...of进行遍历。
常用方法
add(value):向Set中添加一个元素。has(value):检查Set中是否包含某个值。delete(value):删除Set中的某个元素。clear():清空Set中的所有元素。size():获取set的大小
2、map
Map 是一种键值对的集合,与普通对象不同,Map 的键可以是任何数据类型,而对象的键通常是字符串或符号。
创建 Map
const map = new Map();
map.set('name', 'Alice');
map.set('age', 30);
map.set('city', 'New York');
console.log(map); // 输出: Map { 'name' => 'Alice', 'age' => 30, 'city' => 'New York' }
Map 的特点
- 键值对存储:
Map存储键值对,键可以是任何类型(比如对象、函数、甚至数组)。 - 有序:
Map中的键值对是有序的,按插入顺序存储。 - 可迭代:
Map是可迭代的,支持使用for...of进行遍历。
常用方法
set(key, value):设置键值对。get(key):获取指定键的值。has(key):检查Map是否包含指定的键。delete(key):删除指定的键值对。clear():清空Map中的所有键值对。entries():它返回一个新的迭代器对象,包含 Map 中所有元素的[key, value]对,按照插入顺序排列。
const myMap = new Map();
myMap.set('name', 'Alice');
myMap.set('age', 25);
// 获取 entries 迭代器
const entries = myMap.entries();
// 使用迭代器
console.log(entries.next().value); // ['name', 'Alice']
console.log(entries.next().value); // ['age', 25]
console.log(entries.next().value); // undefined (迭代结束)
常用应用场景
set-去重
Set 是去重的理想选择,因为它会自动忽略重复的元素。如果你有一个数组,想去除其中的重复元素,可以直接使用 Set。
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueSet = new Set(array);
const uniqueArray = [...uniqueSet]; // 将 Set 转回数组
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]
set-标签管理
假设你有一个标签系统,每个标签必须是唯一的,你可以用 Set 来管理这些标签。用户添加标签时,Set 会自动确保标签的唯一性。
class TagManager {
constructor() {
this.tags = new Set();
}
addTag(tag) {
this.tags.add(tag);
}
removeTag(tag) {
this.tags.delete(tag);
}
hasTag(tag) {
return this.tags.has(tag);
}
getAllTags() {
return [...this.tags];
}
}
const manager = new TagManager();
manager.addTag('JavaScript');
manager.addTag('Vue');
manager.addTag('JavaScript'); // 重复标签,不会添加
console.log(manager.getAllTags()); // 输出: ['JavaScript', 'Vue']
map-缓存
Map 非常适合用作缓存存储,尤其是在需要根据一些唯一标识符(比如用户 ID 或请求 URL)来快速查找数据时。它支持任意数据类型作为键,并且具有非常高效的查找性能。
class Cache {
constructor() {
this.cache = new Map();
}
setCache(key, value) {
this.cache.set(key, value);
}
getCache(key) {
return this.cache.get(key);
}
hasCache(key) {
return this.cache.has(key);
}
clearCache() {
this.cache.clear();
}
}
const cache = new Cache();
cache.setCache('user:123', { name: 'Alice', age: 30 });
console.log(cache.getCache('user:123')); // 输出: { name: 'Alice', age: 30 }
配置项存储
Map 还可以用于存储和管理应用程序的配置项。由于配置项通常有多个,且可能需要支持多种数据类型作为键(例如,字符串、数字、对象等),Map 是一个非常合适的选择。
class AppConfig {
constructor() {
this.config = new Map();
}
setConfig(key, value) {
this.config.set(key, value);
}
getConfig(key) {
return this.config.get(key);
}
deleteConfig(key) {
this.config.delete(key);
}
}
const config = new AppConfig();
config.setConfig('theme', 'dark');
config.setConfig('language', 'en');
console.log(config.getConfig('theme')); // 输出: dark
console.log(config.getConfig('language')); // 输出: en