比较运算符用于比较两个操作数的值,并评估它们构成的语句是 true
还是 false
。以下示例使用严格相等运算符 (===
) 来比较两个操作数:表达式 2 + 2
和值 4
。由于表达式的结果和数字值 4
相同,因此此表达式的计算结果为 true
2 + 2 === 4
> true
类型强制转换和相等性
两个最常用的比较运算符是用于松散相等的 ==
和用于严格相等的 ===
。==
通过尽可能将操作数强制转换为匹配的数据类型,对两个值执行松散比较。例如,2 == "2"
返回 true
,即使比较是在数字值和字符串值之间进行的。
2 == 2
> true
2 == "2"
> true
!=
也是如此,仅当要比较的操作数不松散相等时,它才返回 true
。
2 != 3
> true
2 != "2"
> false
使用 ===
或 !==
的严格比较不执行类型强制转换。为了使严格比较的计算结果为 true
,要比较的值必须具有相同的数据类型。因此,2 == "2"
返回 true
,但 2 === "2"
返回 false
2 === 3
> false
2 === "2"
> false
为了消除自动强制转换可能造成的任何歧义,请尽可能使用 ===
。
运算符 | 描述 | 用法 | 结果 |
---|---|---|---|
=== | 严格相等 | 2 === 2 | true |
!== | 严格不等 | 2 !== "2" | true |
== | 相等(或“松散相等”) | 2 == "2" | true |
!= | 不相等 | 2 != "3" | true |
> | 大于 | 3 > 2 | true |
>= | 大于或等于 | 2 >= 2 | true |
< | 小于 | 2 < 3 | true |
<= | 小于或等于 | 2 <= 3 | true |
真值和假值
JavaScript 中的所有值都隐式为 true
或 false
,并且可以强制转换为相应的布尔值,例如,通过使用“松散相等”比较符。一组有限的值强制转换为 false
0
null
undefined
NaN
- 空字符串 (
""
)
所有其他值都强制转换为 true
,包括包含一个或多个字符的任何字符串和所有非零数字。这些通常称为“真值”和“假值”。
"My string" == true
> true
100 == true
> true
0 == true
> false
逻辑运算符
使用逻辑 AND (&&
)、OR (||
) 和 NOT (!
) 运算符根据两个或多个条件语句的评估结果来控制脚本的流程
2 === 3 || 5 === 5;
> true
2 === 2 && 2 === "2"
> false
2 === 2 && !"My string."
> false
逻辑 NOT (!
) 表达式否定操作数的真值或假值,如果操作数的计算结果为 false
,则计算结果为 true
;如果操作数的计算结果为 true
,则计算结果为 false
true
> true
!true
> false
!false
> true
在另一个数据类型(如数字或字符串)前面使用逻辑 NOT 运算符 (!
) 会将该值强制转换为布尔值,并反转结果的真值或假值。
"string"
> "string"
!"string"
> false
0
> 0
!0
> true
常用做法是使用两个 NOT 运算符将数据快速强制转换为其匹配的布尔值
!!"string"
> true
!!0
> false
逻辑 AND 和 OR 运算符本身不执行任何强制转换。它们返回正在评估的两个操作数之一的值,所选操作数由该评估确定。
逻辑 AND (&&
) 仅当其第一个操作数的计算结果为 false
时才返回其两个操作数中的第一个,否则返回第二个操作数。在计算结果为布尔值的比较中,仅当逻辑 AND 两侧的操作数的计算结果均为 true
时,它才返回 true
。如果任一侧的计算结果为 false
,则它返回 false
。
true && false
> false
false && true
> false
false && false
> false
true && true
> true
当 &&
与两个非布尔操作数一起使用时,如果第一个操作数可以强制转换为 false
,则返回第一个操作数,且不进行更改。如果第一个操作数可以强制转换为 true
,则返回第二个操作数,且不进行更改
false && "My string"
> false
null && "My string"
> null
"My string" && false
> false
"My string" && "My second string"
> "My second string"
2 === 2 && "My string"
> "My string"
逻辑 OR (||
) 仅当其第一个操作数的计算结果为 true
时才返回其两个操作数中的第一个,否则返回第二个操作数。在计算结果为布尔值的比较中,这意味着如果任一操作数的计算结果为 true
,则它返回 true
;如果两侧的计算结果都不是 true
,则它返回 false
true || false
> true
false || true
> true
true || true
> true
false || false
> false
当将 ||
与两个非布尔操作数一起使用时,如果第一个操作数可以强制转换为 true
,则返回第一个操作数,且不进行更改。如果第一个操作数可以强制转换为 false
,则返回第二个操作数,且不进行更改
false || "My string"
> "My string"
null || "My string"
> "My string"
"My string" || false
> "My string"
"My string" || "My second string"
> "My string"
2 === 2 || "My string"
> true
Nullish 合并运算符
在 ES2020 中引入,“Nullish 合并运算符”(??
) 仅当第一个操作数具有除 null
或 undefined
以外的任何值时才返回第一个操作数。否则,它返回第二个操作数。
null ?? "My string"
> "My string"
undefined ?? "My string"
> "My string"
true ?? "My string";
> true
??
类似于逻辑 OR,但在评估第一个操作数的方式上更严格。||
为任何可以强制转换为 false
的表达式(包括 undefined
和 null
)返回第二个操作数。??
仅当第一个操作数严格等于 null
或 undefined
时才返回第二个操作数,即使它可以强制转换为 false
0 ?? "My string";
> 0
false ?? "My string";
> false
undefined ?? "My string";
> "My string"
逻辑赋值运算符
使用赋值运算符将第二个运算符的值赋给第一个运算符。最常见的示例是单等号 (=
),用于将值赋给声明的变量。
使用逻辑赋值运算符根据变量的真值或假值有条件地为变量赋值。
逻辑 AND 赋值 (&&=
) 运算符评估第二个操作数,并且仅当第一个操作数的计算结果为 true
时才赋值给第一个操作数,实际上是“如果第一个操作数为真,则将其赋值为第二个操作数的值:”
let myVariable = false;
myVariable &&= 2 + 2;
> false
myVariable = true;
myVariable &&= 2 + 2;
> 4
第一个操作数的真值或假值确定是否执行赋值。但是,尝试使用比较运算符评估第一个操作数会导致 true
或 false
布尔值,该布尔值无法赋值
let myVariable = 5;
myVariable > 2 &&= "My string"
> SyntaxError: Invalid left-hand side in assignment
逻辑 OR 赋值 (||=
) 运算符评估第二个操作数,并且如果第一个操作数的计算结果为 false
,则赋值给第一个操作数,实际上是“如果第一个操作数为假,则将其赋值为第二个操作数的值:”
let myVariable = false;
myVariable ||= 2 + 2;
> 4
myVariable = true;
myVariable ||= 2 + 2;
> true
检查您的理解情况
哪个运算符表示“严格相等”?
===
==
=
!=