全等(===)不进行类型转换,相等(==)会隐式转换类型后再比较;===要求类型和值均相同,==则按规则转换后比较,如0==false为true而0===false为false。

全等(===)不进行类型转换,相等(==)会尝试隐式转换类型后再比较,这是两者最核心的区别。
相等(==)会触发隐式类型转换
当操作数类型不同时,== 会按特定规则转换一方或双方的值,再比较。例如:
-
0 == false→true(false转为0) -
"0" == 0→true(字符串"0"转为数字0) -
"" == false→true(空字符串转为0,false也转为0) -
null == undefined→true(这是特例,其他值都不与它们相等)
全等(===)要求类型和值都一致
=== 跳过所有类型转换,直接判断:类型不同,结果必为 false。
-
0 === false→false(number≠boolean) -
"0" === 0→false(string≠number) -
[1] === [1]→false(对象比较的是引用,不是内容) -
NaN === NaN→false(唯一一个自身不等于自身的值)
常见易错场景
这些情况在用 == 时容易出人意料:
立即学习“Java免费学习笔记(深入)”;
-
document.all == null返回true(历史遗留行为,document.all被当作假值处理) -
{} == {}和[] == []都是false(对象/数组用 == 仍比引用,且每次字面量都是新对象) -
"0" == false→true,但"0" == true→false(true转为1,"0"转为0)
建议与实践
除非明确需要松散比较(如兼容旧逻辑),否则一律使用 ===。
- 用
Number()、Boolean()、String()显式转换,再用 === 比较,逻辑更清晰 - 判断是否为
null或undefined,可用value == null(简洁且安全),但更推荐value === null || value === undefined - ESLint 等工具默认禁用 ==,启用
eqeqeq规则可自动提示
理解转换规则有助于 debug,但日常编码中绕过它,用显式转换加全等,更可靠也更易维护。










