相等运算符 (==)

**相等 (==)** 运算符检查其两个操作数是否相等,返回一个布尔结果。与严格相等运算符不同,它尝试转换和比较不同类型的操作数。

试一试

语法

js
x == y

描述

相等运算符 (==!=) 提供IsLooselyEqual语义。这可以大致概括如下

  1. 如果操作数具有相同的类型,则按如下方式比较它们
    • 对象:仅当两个操作数引用同一个对象时才返回true
    • 字符串:仅当两个操作数具有相同字符且顺序相同时才返回true
    • 数字:仅当两个操作数具有相同的值时才返回true+0-0被视为相同的值。如果任一操作数为NaN,则返回false;因此,NaN永远不等于NaN
    • 布尔值:仅当操作数都为true或都为false时才返回true
    • BigInt:仅当两个操作数具有相同的值时才返回true
    • 符号:仅当两个操作数引用相同的符号时才返回true
  2. 如果其中一个操作数为nullundefined,则另一个操作数也必须为nullundefined才能返回true。否则返回false
  3. 如果其中一个操作数是对象,而另一个是原始值,则将对象转换为原始值
  4. 在此步骤中,两个操作数都将转换为原始值(字符串、数字、布尔值、符号和BigInt之一)。其余的转换将逐个案例进行。
    • 如果它们具有相同的类型,则使用步骤1进行比较。
    • 如果其中一个操作数是符号但另一个不是,则返回false
    • 如果其中一个操作数是布尔值但另一个不是,则将布尔值转换为数字true转换为1,false转换为0。然后再次松散地比较这两个操作数。
    • 数字到字符串:将字符串转换为数字。转换失败会导致NaN,这将保证相等性为false
    • 数字到BigInt:根据其数值进行比较。如果数字为±Infinity或NaN,则返回false
    • 字符串到BigInt:使用与BigInt()构造函数相同的算法将字符串转换为BigInt。如果转换失败,则返回false

松散相等是对称的:对于AB的任何值,A == B的语义始终与B == A相同(除了应用转换的顺序)。

此运算符与严格相等 (===) 运算符之间最显著的区别在于,严格相等运算符不尝试类型转换。相反,严格相等运算符始终认为不同类型的操作数是不同的。严格相等运算符本质上只执行步骤1,然后对于所有其他情况返回false

该算法存在“故意违反”:如果其中一个操作数是document.all,则将其视为undefined。这意味着document.all == nulltrue,但document.all === undefined && document.all === nullfalse

示例

无类型转换的比较

js
1 == 1; // true
"hello" == "hello"; // true

带类型转换的比较

js
"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

对象的比较

js
const object1 = {
  key: "value",
};

const object2 = {
  key: "value",
};

console.log(object1 == object2); // false
console.log(object1 == object1); // true

比较字符串和String对象

请注意,使用new String()构造的字符串是对象。如果将其中一个与字符串字面量进行比较,则String对象将转换为字符串字面量,并将比较其内容。但是,如果两个操作数都是String对象,则将它们作为对象进行比较,并且必须引用同一个对象才能使比较成功

js
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

比较日期和字符串

js
const d = new Date("1995-12-17T03:24:00");
const s = d.toString(); // for example: "Sun Dec 17 1995 03:24:00 GMT-0800 (Pacific Standard Time)"
console.log(d == s); //true

比较数组和字符串

js
const a = [1, 2, 3];
const b = "1,2,3";
a == b; // true, `a` converts to string

const c = [true, 0.5, "hey"];
const d = c.toString(); // "true,0.5,hey"
c == d; // true

规范

规范
ECMAScript语言规范
# sec-equality-operators

浏览器兼容性

BCD表格仅在浏览器中加载

另请参阅