JS数组去重不自动过滤null/undefined,需显式排除;推荐先filter(用item != null)再Set去重,语义清晰且能区分null与undefined。

JS 数组去重时,null 和 undefined 默认不会被自动过滤掉——它们是合法的数组元素,去重逻辑只判断“是否相等”,不主动剔除。要真正“过滤掉”它们(即移除而非仅去重),需在去重前或去重后显式排除。
先过滤再去重(推荐)
这是最清晰、可控的方式:先用 filter 剔除 null/undefined,再对干净数组做去重。
- 使用
Boolean或严格判断:
const cleanArr = arr.filter(item => item != null && item !== undefined);
比 item => item 更安全,避免把 0、false、'' 等 falsy 值误删。
- 再结合 Set 去重(简洁高效):
const uniqueWithoutNullUndef = [...new Set(cleanArr)];
✅ 优势:语义明确、不影响原数组、天然支持 NaN、null、undefined 的区分(Set 中 null !== undefined)。
去重过程中跳过 null 和 undefined
如果必须一步到位(比如用 reduce 或自定义循环),可在比较或收集阶段忽略它们。
- 例如用
reduce+includes:
const result = arr.reduce((acc, cur) => {
if (cur == null || acc.includes(cur)) return acc;
return [...acc, cur];
}, []);
- 注意:
includes对NaN返回false,但此处已跳过 null/undefined,不影响。
用对象键去重时的坑
若用 {} 模拟哈希表(如 obj[item] = true),null 和 undefined 会被强制转为字符串 "null" 和 "undefined",导致:
-
null和undefined被当成同一个 key,只保留一个; -
obj[null]实际访问的是obj["null"]。
❌ 不适合需要区分 null/undefined 的场景。如需保留二者差异,应避免此法。
补充:filter 单独过滤空值的写法
如果只是想清除 null/undefined(不去重),一行就够了:
arr.filter(x => x != null); // 同时排除 null 和 undefined
因为 null == undefined 为 true,且 null == null、undefined == undefined,而 != null 在 JS 中恰好等价于 !== null && !== undefined(规范行为)。


















