js实现set
使用对象模拟 Set
在 JavaScript 中可以用普通对象模拟 Set 功能,利用对象的键唯一性存储值。将值作为对象的键,值统一设为 true。
function createSet() {
const items = {};
return {
add(value) {
items[value] = true;
},
has(value) {
return items[value] === true;
},
delete(value) {
delete items[value];
},
clear() {
Object.keys(items).forEach(key => delete items[key]);
},
size() {
return Object.keys(items).length;
}
};
}
使用数组实现 Set
通过数组存储元素,在操作时检查元素是否存在。这种方法在性能上不如对象实现,但更直观。
function createArraySet() {
const elements = [];
return {
add(value) {
if (!elements.includes(value)) {
elements.push(value);
}
},
has(value) {
return elements.includes(value);
},
delete(value) {
const index = elements.indexOf(value);
if (index !== -1) {
elements.splice(index, 1);
return true;
}
return false;
},
clear() {
elements.length = 0;
},
size() {
return elements.length;
}
};
}
ES6 原生 Set 用法
现代 JavaScript 已内置 Set 类型,直接使用即可。原生 Set 具有更好的性能和更完整的 API。
const set = new Set();
set.add(1);
set.add(2);
set.has(1); // true
set.delete(1);
set.size; // 1
set.clear();
实现迭代功能
为自定义 Set 添加迭代器接口,使其可以像原生 Set 一样用 for...of 遍历。
function createIterableSet() {
const items = {};
return {
// ...其他方法同上
[Symbol.iterator]() {
const keys = Object.keys(items);
let index = 0;
return {
next() {
return {
value: keys[index],
done: index++ >= keys.length
};
}
};
}
};
}
类型安全的 Set 实现
通过类型检查确保 Set 中只包含特定类型的值,比如只允许数字。
function createTypedSet(type) {
const items = {};
return {
add(value) {
if (typeof value !== type) {
throw new Error(`Type ${type} required`);
}
items[value] = true;
},
// ...其他方法
};
}
性能优化建议
对于大规模数据,考虑以下优化手段:

- 使用 Object.create(null) 创建无原型链的对象减少查找时间
- 对哈希冲突进行处理,实现更完善的哈希表结构
- 对于数值型数据可使用 TypedArray 提高存储效率
以上方法展示了 JavaScript 中实现 Set 数据结构的多种方式,从简单模拟到完整功能实现。实际项目中推荐直接使用 ES6 原生 Set,对于特殊需求可参考这些实现方案进行定制。






