这是一个 JavaScript 中最经典、最基础的面试题,考察对相等性判断和类型转换的理解。
✅ 核心区别
比较符 | 名称 | 是否进行类型转换 | 推荐使用 |
---|---|---|---|
== | 相等(松散相等) | ✅ 是(会进行隐式类型转换) | ❌ 不推荐 |
=== | 严格相等(全等) | ❌ 否(不进行类型转换) | ✅ 强烈推荐 |
🔍 详细解释
1. ==
(相等)—— 松散比较,会进行隐式类型转换
==
在比较两个值时,如果类型不同,会尝试将它们转换为相同类型后再比较。
console.log(1 == '1'); // true (字符串 '1' 转为数字 1)
console.log(0 == false); // true (false 转为数字 0)
console.log('' == 0); // true (空字符串转为数字 0)
console.log(null == undefined); // true (特殊规则)
console.log(true == '1'); // true ('1' 转为数字 1,true 也转为 1)
⚠️ 这种隐式转换容易导致意外结果,是 bug 的常见来源。
2. ===
(严格相等)—— 类型和值都必须相同
===
不会进行类型转换,只有当两个值的类型和值都相同时,才返回 true
。
console.log(1 === '1'); // false (类型不同:number vs string)
console.log(0 === false); // false (类型不同)
console.log('' === 0); // false
console.log(null === undefined); // false (类型不同)
console.log(true === 1); // false
console.log(2 === 2); // true (类型和值都相同)
✅ 常见“坑”示例(==
的陷阱)
console.log([] == false); // true
console.log('' == false); // true
console.log(0 == '0'); // true
console.log(false == 'false'); // false ('false' 转为数字是 NaN)
// 最经典的:
console.log(NaN == NaN); // false (NaN 不等于任何值,包括自己)
console.log(NaN === NaN); // false
这些行为让代码变得不可预测。
✅ 如何判断 NaN
?
由于 NaN == NaN
和 NaN === NaN
都是 false
,判断 NaN
应使用:
isNaN(value); // 旧方法,会先尝试转换为数字
Number.isNaN(value); // ES6+ 推荐,只判断真正的 NaN
✅ !=
vs !==
!=
:不相等(松散),会进行类型转换!==
:严格不相等,不转换类型
console.log(1 != '1'); // false (因为 1 == '1')
console.log(1 !== '1'); // true (类型不同)
✅ 总结(面试回答模板)
==
和===
的核心区别在于是否进行类型转换:
==
是松散相等,会尝试将两边的值转换为相同类型后再比较,容易产生意外结果;===
是严格相等,不进行类型转换,只有类型和值都相同时才返回true
;推荐在所有情况下都使用
===
和!==
,避免因隐式类型转换导致的 bug。例如:
1 == '1'
返回true
,但1 === '1'
返回false
,后者更符合直觉和类型安全原则。📌 一句话总结:永远使用
===
,避免==
。
THE END