严格相等运算符===不进行类型转换,仅当类型和值均相同时返回true:类型不同直接返回false(如5==='5'为false),类型相同时再比较值(如'abc'==='abc'为true);!==是其逻辑取反,同样不转换类型。

JavaScript 中的严格相等与不相等比较,靠的是 === 和 !== 这两个运算符。它们不隐式转换类型,只在类型和值都完全一致时才返回 true,否则直接判为 false。
严格相等(===)的核心规则
=== 比较分两步走:先看类型,再看值。
- 类型不同,立刻返回
false,不继续比值(例如5 === '5'是false) - 类型相同,再逐个判断值是否一致(
'abc' === 'abc'是true,但'abc' === 'ABC'是false) -
null和undefined类型不同,所以null === undefined是false - 对象、数组、函数等引用类型,只在指向同一内存地址时才相等(
[] === []是false,因为是两个独立实例)
严格不相等(!==)就是 === 的逻辑取反
它不是“先用 == 再取反”,而是和 === 一样,先比类型、再比值,最后把结果翻转。
-
0 !== false→true(类型不同:number vs boolean) -
'1' !== 1→true(类型不同:string vs number) -
NaN !== NaN→true(注意:NaN 用 === 或 !== 比较都返回false和true,这是特例)
为什么推荐默认用 === 而不是 ==
== 的隐式转换规则复杂且容易出错,比如:
-
'' == 0→true(空字符串转成 0) -
0 == false→true(false 转成 0) -
'0' == false→true('0' → 0,再和 false → 0 比) - 这些链式转换会让条件判断变得不可靠,尤其在表单校验、状态判断等场景中容易埋下 bug
实际编码中的使用建议
- 所有基础类型(string/number/boolean/null/undefined)的相等判断,一律优先用
=== - switch 语句内部自动使用严格相等,所以 case 值无需额外处理类型
- 需要特殊处理
NaN或-0时,可考虑Object.is()(如Object.is(NaN, NaN)返回true) - 仅在明确需要类型转换的极少数兼容场景(如旧接口返回字符串数字),才谨慎使用
==,并加注释说明原因
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











