面试题:JavaScript 的 == 和 === 有什么区别?

这是一个 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 == NaNNaN === 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
喜欢就支持一下吧
点赞9 分享