平等(==)
相等 (==
) 运算符检查两个操作数是否相等,并返回布尔结果。与 严格平等 运算符不同,它尝试转换和比较不同类型的操作数。
¥The equality (==
) operator checks whether its two operands are equal,
returning a Boolean result.
Unlike the strict equality operator,
it attempts to convert and compare operands that are of different types.
Try it
语法
描述
¥Description
相等运算符(==
和 !=
)提供 IsLooselyEqual 语义。这可以大致概括如下:
¥The equality operators (==
and !=
) provide the IsLooselyEqual semantic. This can be roughly summarized as follows:
- 如果操作数具有相同类型,则比较如下:
- 对象仅当两个操作数引用同一对象时才返回
true
。 - 字符串:仅当两个操作数具有相同顺序的相同字符时才返回
true
。 - 数字:仅当两个操作数具有相同值时才返回
true
。+0
和-0
被视为相同的值。如果任一操作数为NaN
,则返回false
;因此,NaN
永远不等于NaN
。 - 布尔值:仅当操作数均为
true
或均为false
时才返回true
。 - 大整数:仅当两个操作数具有相同值时才返回
true
。 - 符合:仅当两个操作数引用相同符号时才返回
true
。
- 对象仅当两个操作数引用同一对象时才返回
- 如果其中一个操作数是
null
或undefined
,则另一个操作数也必须是null
或undefined
,才能返回true
。否则返回false
。 - 如果其中一个操作数是对象,另一个是原语,则 将对象转换为原始对象。
- 在此步骤中,两个操作数都转换为基元(String、Number、Boolean、Symbol 和 BigInt 之一)。其余的转换将根据具体情况进行。
松散相等是对称的:对于 A
和 B
的任何值,A == B
始终具有与 B == A
相同的语义(应用转换的顺序除外)。
¥Loose equality is symmetric: A == B
always has identical semantics to B == A
for any values of A
and B
(except for the order of applied conversions).
此运算符与 严格平等 (===
) 运算符之间最显着的区别是严格相等运算符不尝试类型转换。相反,严格相等运算符始终认为不同类型的操作数是不同的。严格相等运算符本质上仅执行步骤 1,然后对于所有其他情况返回 false
。
¥The most notable difference between this operator and the strict equality (===
) operator is that the strict equality operator does not attempt type conversion. Instead, the strict equality operator always considers operands of different types to be different. The strict equality operator essentially carries out only step 1, and then returns false
for all other cases.
上述算法有一个 "故意违反":如果其中一个操作数是 document.all
,则将其视为 undefined
。这意味着 document.all == null
是 true
,但 document.all === undefined && document.all === null
是 false
。
¥There's a "willful violation" of the above algorithm: if one of the operands is document.all
, it is treated as if it's undefined
. This means that document.all == null
is true
, but document.all === undefined && document.all === null
is false
.
示例
不进行类型转换的比较
与类型转换的比较
¥Comparison with type conversion
"1" == 1; // true
1 == "1"; // true
0 == false; // true
0 == null; // false
0 == undefined; // false
0 == !!null; // true, look at Logical NOT operator
0 == !!undefined; // true, look at Logical NOT operator
null == undefined; // true
const number1 = new Number(3);
const number2 = new Number(3);
number1 == 3; // true
number1 == number2; // false
对象比较
比较字符串和 String 对象
¥Comparing strings and String objects
请注意,使用 new String()
构造的字符串是对象。如果将其中之一与字符串文字进行比较,则 String
对象将转换为字符串文字,并对内容进行比较。但是,如果两个操作数都是 String
对象,则它们将作为对象进行比较,并且必须引用同一对象才能成功进行比较:
¥Note that strings constructed using new String()
are objects. If you
compare one of these with a string literal, the String
object will be
converted to a string literal and the contents will be compared. However, if both
operands are String
objects, then they are compared as objects and must
reference the same object for comparison to succeed:
const string1 = "hello";
const string2 = String("hello");
const string3 = new String("hello");
const string4 = new String("hello");
console.log(string1 == string2); // true
console.log(string1 == string3); // true
console.log(string2 == string3); // true
console.log(string3 == string4); // false
console.log(string4 == string4); // true
比较日期和字符串
比较数组和字符串
规范
Specification |
---|
ECMAScript Language Specification # sec-equality-operators |
浏览器兼容性
BCD tables only load in the browser
也可以看看
¥See also