ES6中Set和Map
Set
Set在js中是使用'{}'进行表示的(size代表这个数据的数据长度):

我们在里面加入值的话呢,得到的是这样一个数据结构:

跟对象很像,但是只有值没有key,不是key:value的形式;
跟数组又很相似,只是是用‘{}’表示的。这种跟数组相似的数据结构我们称为类数组。
特点
-
成员唯一,无重复项
-
不能取到具体的某一个值,但是可以判断是否含有某个值(
has())
常用方法
delete(value): 删除Set中指定的值。

add(value): 添加一个值到Set中。如果值已存在,则不会添加。

has(value): 检查Set中是否包含指定的值。

clear(): 清空Set中的所有值。

size: 获取Set中的元素个数。

-
keys(): 返回一个包含所有值的迭代器(与values()方法相同)。 -
values(): 返回一个包含所有值的迭代器。 -
entries(): 返回一个包含所有[value, value]键值对的迭代器。

由于Set的元素不可重复性,我们可以利用这一点来进行数组去重的操作
Set除了可以接收数组还能接收别的数据类型,但是这个数据类型必须具有迭代器iterable属性(即可以被遍历)
数组去重
好了,现在我们已经知道Set是可以帮我们给一个数组去重,Set可以直接接收一个数组,那去重之后怎么转回数组呢?
可以采用解构
const arr = [1, 2, 3, 4, 4, 3, 2, 1]
//去除重复项
const arr2 = [...new Set(arr)]//解构
console.log(arr2);

字符串去重
由于字符串也是具有迭代器iterable属性的,可以被遍历,所以也可以直接把字符串传进Set中。
转回字符串我们可以通过添加空字符串的方法实现。
const str = 'abcabc'
console.log([...new Set(str)].join(''));
ps.
{a:1}+''不是变成'{a:1}'而是变成'[object Object]'JavaScript 会尝试调用对象的
toString方法来将其转换为字符串。如果对象没有定义toString方法,则会使用Object.prototype.toString方法,这通常返回的是[object Object]
遍历
for-of
我们可以使用for-of来进行遍历,for-of是专门用来遍历具有iterable属性结构的方法。
const s = new Set([1, 2, 3, 3])
for (const item of s.entries()) {
console.log(item);
}

forEach
在es6之前,只有数组可以用forEach方法,但今时不同往日,Set也能用forEach进行遍历了
s.forEach((val, key) => {
console.log(val, key);//得到键名和键值
})
WeakSet
WeakSet 的成员只能是对象和 Symbol 值
- 弱引用
-
一个对象存放在了其他结构中,当后续存在其他对象引用这个对象,那么这个对象的内存就不会被回收.
-
一个对象obj存在了其它结构当中,当后续只存在WeakSet对它的引用,该对象的内存依然会被回收.
WeakSet 的成员是不适合引用的,因为它会随时消失
只能存储对象:WeakSet中的元素必须是对象,不能存储原始数据类型(如数字、字符串等)。
弱引用:WeakSet对存储的对象是弱引用,即使对象存在于WeakSet中,如果在其他地方没有被引用,它仍然可以被垃圾回收器回收。
无法迭代:由于弱引用的特性,WeakSet没有提供像Set那样的迭代方法,例如forEach、keys、values和entries。
不可遍历:WeakSet没有size属性和clear方法,也不能使用for...of循环进行遍历
示例
const weakSet = new WeakSet();
const obj = {}; weakSet.add(obj);
console.log(weakSet.has(obj)); // true
weakSet.delete(obj);
console.log(weakSet.has(obj)); // false

Map
在之前,对象中的key只能是字符串,但是随着需求的发展,我们想用别的数据诶新当做key咋办呢,Map就来了,Map可以使用任意数据类型作key。
Map 是一种数据结构(不是数组上的那个map遍历方法),允许使用任何类型的值作为键(包括对象和函数),并且维护键值对的顺序。
特点
- 键值对:
Map存储的是键值对,每个键只能出现一次。 - 按插入顺序遍历:
Map保持键值对的插入顺序。
常用方法
set(key, value): 添加或更新键值对。(不是上文的那个数据结构Set)get(key): 获取指定键的值。delete(key): 删除指定键及其对应的值。has(key): 检查Map中是否包含指定的键。clear(): 清空Map中的所有键值对。size: 获取Map中的键值对个数。keys(): 返回一个包含所有键的迭代器。values(): 返回一个包含所有值的迭代器。entries(): 返回一个包含所有[key, value]键值对的迭代器。
示例
const map = new Map();
map.set('name', 'Alice');
map.set('age', 25);
console.log(map.get('name')); // Alice
console.log(map.size); // 2
map.delete('age');
console.log(map.size); // 1

WeakMap
WeakMap 是一种类似于 Map 的数据结构,但其键是弱引用的。以下是一些主要特点:
- 只能使用对象作为键:
WeakMap的键必须是对象(包括Symbol),不能是原始数据类型。 - 弱引用: 对存储在
WeakMap中的键进行弱引用,如果没有其他地方引用该对象,它可以被垃圾回收器回收。 - 不可迭代:
WeakMap没有迭代器方法,也无法获取其元素的数量。
示例
const weakMap = new WeakMap();
const obj = {};
weakMap.set(obj, 'value');
console.log(weakMap.get(obj)); // value
weakMap.delete(obj);
console.log(weakMap.get(obj)); // undefined

这些数据结构提供了灵活的方式来处理和存储数据,根据需要选择适合的结构能够提高代码的性能和可维护性。
转载自:https://juejin.cn/post/7397608098213412899