=== 严格相等运算符要求值和类型均一致,不进行任何隐式转换;类型不同直接返回 false,类型相同时按数字、字符串、布尔值、null/undefined、对象等规则逐项比较。

直接用 ===(三等号)就能排除隐式转换干扰。它要求值和类型都一致,只要任一不匹配,结果就是 false,不会尝试把字符串转成数字、把对象转成布尔值之类的事。
严格相等的判断逻辑很明确
=== 不会做任何类型转换,只分两步:
- 先看左右两边的数据类型是否相同;类型不同,直接返回 false
- 类型相同,再按类型规则比值:
- 数字:
0 === -0是 true,NaN === NaN是 false - 字符串:逐字符 Unicode 码点完全一致才算相等
- 布尔值:只有
true === true或false === false - null 和 undefined:各自只和自己相等,
null === undefined是 false - 对象(含数组、函数):必须指向同一个内存地址才相等
- 数字:
常见易错对比场景
这些例子能清楚看出 === 如何守住类型边界:
-
"10" === 10→ false(字符串 vs 数字) -
0 === false→ false(数字 vs 布尔) -
[] === []→ false(两个独立数组,地址不同) -
{} === {}→ false(同理,对象引用不同) -
new Date() === new Date()→ false(即使时间相同,也是两个实例)
配合显式转换更可控
如果确实需要跨类型比较(比如验证用户输入是否为数值 5),就主动转一次,再用 ===:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 转数字:
Number(input) === 5(注意Number("abc")得NaN,NaN === NaN是 false,可加额外判断) - 转字符串:
String(value) === "hello" - 转布尔:
Boolean(flag) === true(比!!flag === true更直白)
替代方案:Object.is() 更严谨
对于极少数 === 处理不了的情况(比如区分 +0 和 -0,或让 NaN === NaN 成立),可用 Object.is():
-
Object.is(+0, -0)→ false -
Object.is(NaN, NaN)→ true - 其余行为和
===完全一致
日常开发中,坚持用 === 就能避开绝大多数隐式转换陷阱。真有特殊需求,再叠加显式转换或 Object.is() 补足。

















