此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
相等(==)
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
相等(==)运算符检查其两个操作数是否相等,返回一个布尔值结果。与严格相等运算符不同,它会尝试转换不同类型的操作数,并进行比较。
In this article
尝试一下
console.log(1 == 1);// Expected output: trueconsole.log("hello" == "hello");// Expected output: trueconsole.log("1" == 1);// Expected output: trueconsole.log(0 == false);// Expected output: true语法
js
x == y描述
相等运算符(== 和!=)提供非严格相等语义。这可以大致总结如下:
- 如果操作数具有相同的类型,则按如下方式进行比较:
- 对象(Object):仅当两个操作数引用同一个对象时返回
true。 - 字符串(String):仅当两个操作数具有相同的字符且顺序相同时返回
true。 - 数字(Number):如果两个操作数的值相同,则返回
true。+0和-0被视为相同的值。如果任何一个操作数是NaN,返回false;所以,NaN永远不等于NaN。 - 布尔值(Boolean):仅当操作数都为
true或都为false时返回true。 - 大整型(BigInt):仅当两个操作数的值相同时返回
true。 - 符号(Symbol):仅当两个操作数引用相同的符号时返回
true。
- 对象(Object):仅当两个操作数引用同一个对象时返回
- 如果其中一个操作数为
null或undefined,另一个操作数也必须为null或undefined以返回true。否则返回false。 - 如果其中一个操作数是对象,另一个是原始值,则将对象转换为原始值。
- 在这一步,两个操作数都被转换为原始值(字符串、数字、布尔值、符号和大整型中的一个)。剩余的转换将分情况完成。
宽松相等是对称的:A == B 对于A 和B 的任何值总是具有与B == A 相同的语义(应用转换的顺序除外)。
该运算符与严格相等(===)运算符之间最显著的区别是,严格相等运算符不尝试类型转换。相反,严格相等运算符总是认为不同类型的操作数是不同的。严格相等运算符本质上只执行第 1 步,然后对所有其他情况返回false。
上面的算法有一个“故意违反”:如果其中一个操作数是document.all,则它被视为undefined。这意味着document.all == null 是true,但document.all === undefined && document.all === null 是false。
示例
>没有类型转换的比较
js
1 == 1; // true"hello" == "hello"; // true有类型转换的比较
js
"1" == 1; // true1 == "1"; // true0 == false; // true0 == null; // false0 == undefined; // false0 == !!null; // true,看看逻辑非运算符0 == !!undefined; // true,看看逻辑非运算符null == undefined; // trueconst number1 = new Number(3);const number2 = new Number(3);number1 == 3; // truenumber1 == number2; // false比较对象
js
const object1 = { key: "value",};const object2 = { key: "value",};console.log(object1 == object2); // falseconsole.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); // trueconsole.log(string1 == string3); // trueconsole.log(string2 == string3); // trueconsole.log(string3 == string4); // falseconsole.log(string4 == string4); // true比较日期和字符串
js
const d = new Date("December 17, 1995 03:24:00");const s = d.toString(); // 例如:“Sun Dec 17 1995 03:24:00 GMT+0800 (中国标准时间)”console.log(d == s); // true比较数组和字符串
js
const a = [1, 2, 3];const b = "1,2,3";a == b; // true,`a` 转换为字符串const c = [true, 0.5, "hey"];const d = c.toString(); // "true,0.5,hey"c == d; // true规范
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-equality-operators> |