!== 同步检查类型和值,任一不同即返回 true;类型不同时直接返回 true,不比较值;类型相同时才比较值是否相等。

JavaScript 中严格不相等运算符 !== 本身就是为“同时排除值差异和类型差异”而设计的,它不进行任何隐式转换,只要类型不同或值不同,就返回 true。准确排除类型差异,关键在于理解它的判定逻辑并避开常见误用场景。
!== 的判定逻辑:类型或值任一不同即为 true
它不是“先比值、再比类型”,而是**同步检查两个维度**:
- 如果左右操作数类型不同 → 立刻返回
true(无需看值) - 如果类型相同 → 再比较值是否相等;值不等 → 返回
true;值相等 → 返回false
例如:0 !== false → true(number vs boolean,类型不同)"5" !== 5 → true(string vs number)null !== undefined → true(类型相同,但值不同,且不触发抽象相等规则)
精准排除类型差异的典型用法
当你明确想区分“数字 0”和“字符串 '0'”,或“空字符串”和“null”,就该用 !==:
- 过滤用户输入中的纯数字 0:
if (input !== 0) { /* 允许 "0"、false、[] 进入 */ } - 判断 API 响应码是否非成功数值:
if (status !== 200)(不会把字符串"200"当作成功) - 检查变量是否确实不是
undefined或null(需两者都排除):if (val !== undefined && val !== null)
容易混淆的边界情况要特别注意
这些不是 bug,而是 !== 按规范工作的表现,忽略会导致逻辑偏差:
-
NaN !== NaN是true(NaN 与任何值,包括自己,严格不等) -
[] !== []是true(对象/数组按引用比较,两个新数组永远不等) -
"" !== null是true,但!""是true—— 二者语义完全不同,不能互换 - 浮点数精度问题:
0.1 + 0.2 !== 0.3是true,这不是类型问题,而是值本身就不等
替代方案:什么时候不该硬用 !==
若目标是“排除 null 和 undefined”,!== 需写两次;更简洁安全的方式是:
- 用空值合并:
if ((val ?? null) !== null) - 用显式双等判断:
if (val != null)(宽松,但语义清晰) - 需要深度内容比较时,不用
!==,改用JSON.stringify(a) !== JSON.stringify(b)或专用库
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











