Set
是 JavaScript 中的一种数据结构,类似于数组,但其成员的值都是唯一的,没有重复的值。Set
对象保存值的唯一性是通过使用其内部算法,在添加新元素时比较它们来实现的。
// 创建一个 Set
let mySet = new Set();
// 添加元素
mySet.add(1); // Set { 1 }
mySet.add(2); // Set { 1, 2 }
mySet.add(1); // 重复的值不会被添加,结果仍然是 Set { 1, 2 }
// 获取 Set 的大小
console.log(mySet.size); // 输出:2
// 遍历 Set
for (let item of mySet) {
console.log(item);
}
// 输出:
// 1
// 2
// 删除元素
mySet.delete(1);
console.log(mySet.size); // 输出:1
问题:为什么 Set
的 size
属性有时候不准确?
原因:这种情况通常发生在并发修改 Set
的情况下,比如在一个循环中同时读取和修改 Set
。
解决方法:
size
属性时,不会有其他操作修改 Set
。Array.from(set)
转换为数组后再进行操作,这样可以避免直接在迭代过程中修改原 Set
。let mySet = new Set([1, 2, 3, 4, 5]);
// 错误的做法:在遍历时修改 Set
for (let i = 0; i < mySet.size; i++) {
mySet.delete(i); // 这会导致 size 在迭代过程中变化,可能出现意外结果
}
// 正确的做法:先转换为数组处理
let array = Array.from(mySet);
array.forEach(value => {
if (value % 2 === 0) {
mySet.delete(value);
}
});
通过上述方法,可以有效避免在并发操作中出现的 size
不准确的问题。