在 JavaScript 中,Set 和 Map 都是基于哈希表实现的。
Set
- 特点:
Set是一种集合类型,用于存储独特的值,确保集合中的每个值都是唯一的。 - 哈希表:
Set内部使用哈希表来存储元素。每个值在插入时会通过哈希函数生成一个哈希值,然后根据这个哈希值确定存储位置。因此,查找、插入和删除操作的时间复杂度通常为 O(1)。 - 使用场景:
Set适用于需要快速判断元素是否存在于集合中,或者需要存储不重复的值的场景。
Set 常用方法和属性
1. 属性
-
size: 返回Set对象中值的数量。let mySet = new Set([1, 2, 3]); console.log(mySet.size); // 输出: 3
2. 方法
-
add(value): 向Set添加一个新值,返回Set对象本身。let mySet = new Set(); mySet.add(1); mySet.add(2); console.log(mySet); // 输出: Set { 1, 2 } -
delete(value): 从Set中移除指定的值,返回一个布尔值,表示删除是否成功。let mySet = new Set([1, 2, 3]); mySet.delete(2); console.log(mySet); // 输出: Set { 1, 3 } -
has(value): 返回一个布尔值,表示Set中是否存在指定的值。let mySet = new Set([1, 2, 3]); console.log(mySet.has(2)); // 输出: true console.log(mySet.has(4)); // 输出: false -
clear(): 清空Set对象,移除所有值。let mySet = new Set([1, 2, 3]); mySet.clear(); console.log(mySet.size); // 输出: 0 -
forEach(callback, thisArg): 使用提供的回调函数遍历Set中的每个值。let mySet = new Set([1, 2, 3]); mySet.forEach(value => console.log(value)); // 输出: // 1 // 2 // 3 -
values(): 返回一个新的Iterator对象,包含Set对象中的所有值。let mySet = new Set([1, 2, 3]); for (let value of mySet.values()) { console.log(value); // 输出 1, 2, 3 } -
keys(): 也是返回Set对象中的所有值,与values()方法相同。因为Set中没有键,所有的键和值是相同的。let mySet = new Set([1, 2, 3]); for (let key of mySet.keys()) { console.log(key); // 输出 1, 2, 3 } -
entries(): 返回一个新的Iterator对象,包含Set对象中每个值的[value, value]对形式的数组。let mySet = new Set([1, 2, 3]); for (let entry of mySet.entries()) { console.log(entry); // 输出 [1, 1], [2, 2], [3, 3] }
Map
- 特点:
Map是一种键值对集合,允许使用任何类型的值(包括对象)作为键,并关联一个值。 - 哈希表:
Map也使用哈希表来存储键值对。每个键通过哈希函数生成一个哈希值,从而快速定位存储的值。查找、插入和删除操作的时间复杂度通常也是 O(1)。 - 使用场景:
Map适用于需要通过键快速查找对应值的场景,尤其是当键值对的键不是简单的字符串或数字时。
Map 常用方法和属性
1. 属性
-
size: 返回Map对象中键值对的数量。let myMap = new Map([['a', 1], ['b', 2]]); console.log(myMap.size); // 输出: 2
2. 方法
-
set(key, value): 设置键key的值为value,返回Map对象本身。let myMap = new Map(); myMap.set('a', 1); myMap.set('b', 2); console.log(myMap); // 输出: Map { 'a' => 1, 'b' => 2 } -
get(key): 返回key对应的值,如果key不存在则返回undefined。let myMap = new Map([['a', 1], ['b', 2]]); console.log(myMap.get('a')); // 输出: 1 console.log(myMap.get('c')); // 输出: undefined -
delete(key): 删除Map对象中指定key的键值对,返回一个布尔值,表示删除是否成功。let myMap = new Map([['a', 1], ['b', 2]]); myMap.delete('a'); console.log(myMap); // 输出: Map { 'b' => 2 } -
has(key): 返回一个布尔值,表示Map对象是否包含指定的键key。let myMap = new Map([['a', 1], ['b', 2]]); console.log(myMap.has('a')); // 输出: true console.log(myMap.has('c')); // 输出: false -
clear(): 清空Map对象,移除所有键值对。let myMap = new Map([['a', 1], ['b', 2]]); myMap.clear(); console.log(myMap.size); // 输出: 0 -
forEach(callback, thisArg): 使用提供的回调函数遍历Map对象中的每个键值对。let myMap = new Map([['a', 1], ['b', 2]]); myMap.forEach((value, key) => { console.log(key, value); }); // 输出: // 'a' 1 // 'b' 2 -
keys(): 返回一个新的Iterator对象,包含Map对象中的所有键。let myMap = new Map([['a', 1], ['b', 2]]); for (let key of myMap.keys()) { console.log(key); // 输出 'a', 'b' } -
values(): 返回一个新的Iterator对象,包含Map对象中的所有值。let myMap = new Map([['a', 1], ['b', 2]]); for (let value of myMap.values()) { console.log(value); // 输出 1, 2 } -
entries(): 返回一个新的Iterator对象,包含Map对象中所有[key, value]对形式的数组。let myMap = new Map([['a', 1], ['b', 2]]); for (let entry of myMap.entries()) { console.log(entry); // 输出 ['a', 1], ['b', 2] }
总结
虽然 Set 和 Map 都基于哈希表,但它们的用途和接口有所不同。Set 专注于元素的唯一性,而 Map 则用于管理键值对。由于哈希表的高效性,这两者都能够在大多数情况下提供快速的查找、插入和删除操作。
在 JavaScript 中,Set 和 Map 都有一些常用的方法和属性。
Set是用来存储唯一值的集合,没有键的概念。Map是用来存储键值对的集合,支持各种类型的键。
两者都提供了遍历和操作其内容的方法,并且在性能上都具有较高的效率。