测验

JavaScript 中 `==` 和 `===` 的区别是什么?

主题
JavaScript
在GitHub上编辑

TL;DR

== 是抽象相等运算符,而 === 是严格相等运算符。== 运算符会在进行任何必要的类型转换后比较是否相等。=== 运算符不会进行类型转换,因此如果两个值不是同一类型,=== 将直接返回 false

运算符=====
名称(宽松)相等运算符严格相等运算符
类型转换
比较值和类型

相等运算符 (==)

== 运算符检查两个值是否相等,但如果这些值的类型不同,则会执行类型转换。这意味着 JavaScript 将尝试在进行比较之前将这些值转换为通用类型。

console.log(42 == '42'); // true
console.log(0 == false); // true
console.log(null == undefined); // true
console.log([] == false); // true
console.log('' == false); // true

在这些示例中,JavaScript 在进行比较之前将操作数转换为相同的类型。例如,42 == '42' 为 true,因为字符串 '42' 在比较之前被转换为数字 42

但是,当使用 == 时,可能会发生不直观的结果:

console.log(1 == [1]); // true
console.log(0 == ''); // true
console.log(0 == '0'); // true
console.log('' == '0'); // false

作为一般经验法则,永远不要使用 == 运算符,除非为了方便与 nullundefined 进行比较,其中 a == null 将在 anullundefined 时返回 true

var a = null;
console.log(a == null); // true
console.log(a == undefined); // true

严格相等运算符 (===)

=== 运算符,也称为严格相等运算符,检查两个值是否相等,而不执行类型转换。这意味着,只有当值和类型都相同时,比较才会返回 true。

console.log(42 === '42'); // false
console.log(0 === false); // false
console.log(null === undefined); // false
console.log([] === false); // false
console.log('' === false); // false

对于这些比较,不执行类型转换,因此如果类型不同,该语句将返回 false。例如,42 === '42'false,因为类型(数字和字符串)不同。

// 带有类型转换的比较 (==)
console.log(42 == '42'); // true
console.log(0 == false); // true
console.log(null == undefined); // true
// 不带类型转换的严格比较 (===)
console.log(42 === '42'); // false
console.log(0 === false); // false
console.log(null === undefined); // false

额外内容:Object.is()

JavaScript 中最后一个值比较操作是 Object.is() 静态方法。Object.is()=== 之间唯一的区别在于它们如何处理带符号的零和 NaN 值。=== 运算符(和 == 运算符)将数字值 -0+0 视为相等,但将 NaN 视为彼此不相等。

结论

  • 当您希望使用类型强制转换比较值时使用 ==(并了解其含义)。实际上,等号运算符的唯一有效用例是针对 nullundefined 以方便使用。
  • 当您希望确保值和类型都相同时使用 ===,这在大多数情况下是更安全、更可预测的选择。

笔记

  • 建议使用 ===(严格相等)以避免类型强制转换的缺陷,这可能导致代码中出现意外行为和错误。它使您的比较意图更清晰,并确保您同时比较值和类型。
  • ESLint 的 eqeqeq 规则强制使用严格相等运算符 ===!==,甚至提供了一个选项,始终强制使用严格相等,除非与 null 字面量进行比较。

延伸阅读

在GitHub上编辑