Set.prototype.symmetricDifference() 已纳入ES2024标准,但Chrome 125+、Firefox 126+(需开启标志)、Safari技术预览版才支持;需用typeof Set.prototype.symmetricDifference === 'function'检测,不支持时可用手写函数替代,该方法返回新Set,参数须为Set实例,基于SameValueZero比较。

确认环境是否支持
运行以下代码验证:
console.log(typeof Set.prototype.symmetricDifference === 'function');
返回 true 才可安全使用;若为 false,需回退到手写实现或 polyfill。
基础用法与语义
对称差(symmetric difference)指「只属于 A 或只属于 B 的元素」,即 (A − B) ∪ (B − A),等价于数学中的「异或」逻辑。
示例:
const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);
const result = setA.symmetricDifference(setB);
console.log(result); // Set {1, 2, 5, 6}
注意:原 Set 不会被修改,始终返回一个全新 Set 实例。
实用技巧与注意事项
-
参数必须是 Set 实例:传入数组、对象或字符串会报错。如需处理数组,先转为 Set:
new Set(arr) -
SameValueZero 比较天然可靠:能正确识别
NaN和undefined(例如new Set([NaN]).symmetricDifference(new Set([NaN]))返回空集) - 不支持嵌套对象的“深度相等”:两个不同引用但内容相同的对象仍被视为不同项(这是 JS 原生行为,非 bug)
- 链式调用受限:该方法返回普通 Set,不带新方法链,如需连续运算需显式赋值再调用
兼容性降级方案(推荐手写)
当环境不支持时,用以下轻量实现替代,行为完全一致且无额外依赖:
function symmetricDifference(set1, set2) {
const diff = new Set();
for (const item of set1) {
if (!set2.has(item)) diff.add(item);
}
for (const item of set2) {
if (!set1.has(item)) diff.add(item);
}
return diff;
}
// 使用方式相同
const result = symmetricDifference(setA, setB); // Set {1, 2, 5, 6}
该函数接受任意可迭代对象(数组、Map.keys() 等),只要提前转为 Set 即可复用逻辑。

















