这是一个 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


