Set
和 Map
是 JavaScript 中提供的两种集合类型的数据结构,它们提供了比传统的数组和对象更丰富的操作方式,适用于不同的使用场景。
Set
Set 是一种新的数据结构,它类似于数组,但其成员是唯一的,即没有重复值。Set
可以用来存储任何类型的唯一值,无论是原始值还是对象引用。
主要特性:
- 唯一性:每个值在
Set
中只能出现一次。即使你多次添加相同的值,也只会保留一个副本。 - 无序性:
Set
中的元素是没有顺序的。 - 迭代:可以使用
for...of
循环或forEach
方法遍历Set
中的所有元素。
常用方法:
add(value)
:添加一个新的元素到Set
中。delete(value)
:从Set
中删除指定元素。has(value)
:检查Set
中是否包含某个值。clear()
:清除所有元素。size
:返回Set
中元素的数量。
let mySet = new Set([1, 2, 3, 4]);
mySet.add(5);
console.log(mySet); // 输出 Set { 1, 2, 3, 4, 5 }
mySet.add(1); // 尝试添加重复值
console.log(mySet); // 输出 Set { 1, 2, 3, 4, 5 },未改变
console.log(mySet.has(1)); // 输出 true
Map
Map 是一种键值对的集合,其中键和值都可以是任意类型。与普通的对象(Object)相比,Map
的键可以是任何数据类型,而不仅仅是字符串。
主要特性:
- 键的多样性:
Map
的键可以是任何类型,包括函数、对象以及基本数据类型。 - 有序性:
Map
维持插入顺序,这意味着你可以按照元素被插入的顺序进行迭代。 - 迭代:可以通过
for...of
或者forEach
来遍历Map
的键值对。
常用方法:
set(key, value)
:设置Map
中的键值对。get(key)
:获取对应键的值。delete(key)
:删除对应的键值对。has(key)
:判断Map
中是否存在指定键。clear()
:清除所有的键值对。size
:返回Map
中键值对的数量。
let myMap = new Map();
myMap.set('name', 'John');
myMap.set(1, 'number one');
console.log(myMap.get('name')); // 输出 John
console.log(myMap.size); // 输出 2
console.log(myMap.has(1)); // 输出 true
总结
Set
适合用于需要保证元素唯一性的场景,比如去重操作。Map
则更适合于需要存储键值对,并且键不局限于字符串的情况,提供了一种更加灵活的数据存储方案。
两者都提供了强大的功能来处理复杂的数据集合,并且由于它们支持迭代器协议,因此很容易与现代JavaScript的新特性(如解构赋值、扩展运算符等)结合使用。