JavaScript 中 `==` 和 `===` 的区别是什么?
TL;DR
== 是抽象相等运算符,而 === 是严格相等运算符。== 运算符会在进行任何必要的类型转换后比较是否相等。=== 运算符不会进行类型转换,因此如果两个值不是同一类型,=== 将直接返回 false。
| 运算符 | == | === | 
|---|---|---|
| 名称 | (宽松)相等运算符 | 严格相等运算符 | 
| 类型转换 | 是 | 否 | 
| 比较值和类型 | 否 | 是 | 
相等运算符 (==)
== 运算符检查两个值是否相等,但如果这些值的类型不同,则会执行类型转换。这意味着 JavaScript 将尝试在进行比较之前将这些值转换为通用类型。
console.log(42 == '42'); // trueconsole.log(0 == false); // trueconsole.log(null == undefined); // trueconsole.log([] == false); // trueconsole.log('' == false); // true
在这些示例中,JavaScript 在进行比较之前将操作数转换为相同的类型。例如,42 == '42' 为 true,因为字符串 '42' 在比较之前被转换为数字 42。
但是,当使用 == 时,可能会发生不直观的结果:
console.log(1 == [1]); // trueconsole.log(0 == ''); // trueconsole.log(0 == '0'); // trueconsole.log('' == '0'); // false
作为一般经验法则,永远不要使用 == 运算符,除非为了方便与 null 或 undefined 进行比较,其中 a == null 将在 a 为 null 或 undefined 时返回 true。
var a = null;console.log(a == null); // trueconsole.log(a == undefined); // true
严格相等运算符 (===)
=== 运算符,也称为严格相等运算符,检查两个值是否相等,而不执行类型转换。这意味着,只有当值和类型都相同时,比较才会返回 true。
console.log(42 === '42'); // falseconsole.log(0 === false); // falseconsole.log(null === undefined); // falseconsole.log([] === false); // falseconsole.log('' === false); // false
对于这些比较,不执行类型转换,因此如果类型不同,该语句将返回 false。例如,42 === '42' 为 false,因为类型(数字和字符串)不同。
// 带有类型转换的比较 (==)console.log(42 == '42'); // trueconsole.log(0 == false); // trueconsole.log(null == undefined); // true// 不带类型转换的严格比较 (===)console.log(42 === '42'); // falseconsole.log(0 === false); // falseconsole.log(null === undefined); // false
额外内容:Object.is()
JavaScript 中最后一个值比较操作是 Object.is() 静态方法。Object.is() 和 === 之间唯一的区别在于它们如何处理带符号的零和 NaN 值。=== 运算符(和 == 运算符)将数字值 -0 和 +0 视为相等,但将 NaN 视为彼此不相等。
结论
- 当您希望通过类型转换比较值(并了解其含义)时,请使用
==。 实际上,相等运算符的唯一合理用例是在单个比较中同时检查null和undefined以方便使用。 - 当您希望确保值和类型都相同时,请使用
===,这在大多数情况下是更安全、更可预测的选择。 
笔记
- 建议使用 
===(严格相等)以避免类型强制转换的缺陷,这可能导致代码中出现意外行为和错误。它使您的比较意图更清晰,并确保您同时比较值和类型。 - ESLint 的 
eqeqeq规则强制使用严格相等运算符===和!==,甚至提供了一个选项,始终强制使用严格相等,除非与null字面量进行比较。 
