set将-0与+0视为相等,仅保留一个零值;其内部使用samevaluezero算法判等,规定+0===-0为true,删除、查询均互通,遍历时统一返回0。

Set 集合将 -0 与 +0 视为完全相等的值,只保留一个。
SameValueZero 算法决定判等逻辑
Set 内部使用 SameValueZero 算法判断值是否重复,该算法明确规定:+0 === -0 为 true。这和严格相等(===)在数值比较上一致,但比抽象相等(==)更严谨(不发生类型转换)。
-
添加时自动去重:无论先加 +0、-0 还是 0,最终 Set 中只存一个零值。
例如:new Set([+0, -0, 0]).size结果为 1 -
删除时互通匹配:用
delete(-0)可以成功移除已存的+0;反之亦然 -
查询时同样生效:
new Set([+0]).has(-0)返回 true
与 NaN 的处理方式类似,但不同于对象
就像 NaN 虽然 NaN !== NaN 却被 Set 当作同一值一样,-0 和 +0 的“语义等价”也被明确纳入 SameValueZero 规则中。而对象仍按引用判等——两个 {} 始终不等,哪怕内容相同。
实际编码中需注意的点
- 若业务逻辑需要区分 -0 和 +0(极少见),不能依赖 Set 原生行为,得自行封装或改用 Map + 自定义键生成
- 从 Set 中遍历时,返回的零值统一表现为
0(引擎内部标准化输出,不是 -0) - 与其他数据结构交互时(如转数组
[...set]),结果中也仅含一个0
这种设计既保持了数学直觉(零没有正负之分),又避免了因符号差异导致意外重复,是 JS 集合行为中稳定可靠的一环。











