JavaScript中应使用哪个相等运算符(== vs ===)?

JavaScript中应使用哪个相等运算符(== vs ===)?

技术背景

在 JavaScript 中,有两种用于比较相等性的运算符:抽象相等运算符 == 和严格相等运算符 ===。理解它们之间的区别对于编写正确且健壮的代码至关重要。

实现步骤

抽象相等运算符(==

== 运算符在进行比较之前会进行必要的类型转换,然后再比较值是否相等。例如:

1
2
true == 1; // true,因为 'true' 被转换为 1 后进行比较
"2" == 2; // true,因为 "2" 被转换为 2 后进行比较

严格相等运算符(===

=== 运算符不会进行类型转换,只有当两个值的类型和值都相同时才会返回 true。例如:

1
2
true === 1; // false
"2" === 2; // false

核心代码

== 运算符的示例

1
2
3
4
5
6
7
8
9
console.log('' == '0');           // false
console.log(0 == ''); // true
console.log(0 == '0'); // true
console.log(false == 'false'); // false
console.log(false == '0'); // true
console.log(false == undefined); // false
console.log(false == null); // false
console.log(null == undefined); // true
console.log(' \t\r\n ' == 0); // true

=== 运算符的示例

1
2
3
4
5
6
7
8
9
console.log('' === '0');           // false
console.log(0 === ''); // false
console.log(0 === '0'); // false
console.log(false === 'false'); // false
console.log(false === '0'); // false
console.log(false === undefined); // false
console.log(false === null); // false
console.log(null === undefined); // false
console.log(' \t\r\n ' === 0); // false

最佳实践

建议始终使用 === 运算符,除非你完全理解 == 运算符进行的类型转换。因为 == 运算符的类型转换规则复杂且难以记忆,容易导致意外的结果。例如:

1
2
3
4
5
6
7
8
9
10
let A = '';  // 空字符串
let B = 0; // 零
let C = '0'; // 零字符串

console.log(A == B); // true
console.log(B == C); // true
console.log(A == C); // false

console.log((A == B) && (B == C)); // true
console.log(A == C); // false

然而,有一个例外情况:== null 是一种检查值是否为 nullundefined 的有效方法。例如:

1
2
3
if (value == null) {
// value 是 null 或 undefined
}

常见问题

为什么 == 运算符的结果难以预测?

== 运算符会进行类型转换,其转换规则复杂,例如空字符串和数字 0 被认为相等,'0'false 也被认为相等,数组和布尔值、字符串的比较也会产生意想不到的结果。

字符串对象和字符串字面量的比较

使用 String 构造函数创建的字符串对象和字符串字面量在使用 ===== 运算符时有不同的表现。例如:

1
2
"abc" == new String("abc");    // true
"abc" === new String("abc"); // false

这是因为 == 运算符比较的是值,而 === 运算符还会比较类型,new String("abc") 的类型是 Object,而 "abc" 的类型是 string

性能差异

在大多数情况下,===== 运算符的性能差异可以忽略不计。性能不是选择 === 运算符的主要原因,类型安全和代码质量才是更重要的考虑因素。


JavaScript中应使用哪个相等运算符(== vs ===)?
https://119291.xyz/posts/which-equals-operator-should-be-used-in-javascript-comparisons/
作者
ww
发布于
2025年5月8日
许可协议