Set的add、delete、has方法均基于SameValueZero算法判等:NaN视为同一值,-0与+0相等,对象按引用比较;add返回Set本身,delete和has返回布尔值。

Set 的 add、delete 和 has 方法行为明确、操作简单,但细节决定正确性。 它们遵循 ECMAScript 规范(ES2015+),核心是基于“SameValueZero”算法判断值是否相等,这直接影响 NaN、-0、对象引用等场景的处理结果。
add():插入唯一值,返回 Set 本身
向 Set 中添加一个值。若该值已存在(按 SameValueZero 判断),不重复插入,也不报错;否则插入并返回当前 Set 对象(可用于链式调用)。
- NaN 可被正常添加且视为同一个值:
const s = new Set(); s.add(NaN).add(NaN); s.size === 1 - -0 和 +0 被视为相同值:
new Set([0, -0]).size === 1 - 对象按引用比较:两个字面量对象即使内容相同,也被视为不同项:
new Set([{a:1}, {a:1}]).size === 2
delete():按值移除,返回布尔结果
删除指定值。使用 SameValueZero 算法查找匹配项,成功删除返回 true,未找到或已不存在返回 false。注意:它不抛错,也不影响 Set 结构完整性。
- 删除 NaN 成功:
const s = new Set([NaN]); s.delete(NaN); // true - 删除 -0 等价于删除 +0:
const s = new Set([0]); s.delete(-0); // true - 删除不存在的值返回 false:
new Set([1,2]).delete(3); // false
has():精确查值,返回布尔标识
判断 Set 是否包含指定值,同样基于 SameValueZero。它是 add/delete 的逻辑基础,也是最常用于条件判断的方法。
立即学习“Java免费学习笔记(深入)”;
- NaN 查找可靠:
new Set([NaN]).has(NaN) // true - 0 与 -0 互通:
new Set([0]).has(-0) // true - 对象必须是同一引用:
const obj = {}; new Set([obj]).has(obj) // true;但 new Set([{}]).has({}) // false
SameValueZero 是 Set(及 Map)内部判等的核心规则,它比 === 更宽松(允许 NaN == NaN),但比抽象相等(==)更严格(不进行类型转换)。理解它,才能写出稳定可靠的集合操作逻辑。










