小于 (<)
**小于 (<
)** 运算符如果左操作数小于右操作数,则返回 true
,否则返回 false
。
试一试
语法
js
x < y
描述
操作数通过多轮强制转换进行比较,可以概括如下
- 首先,对象通过调用其 转换为原始值
[Symbol.toPrimitive]()
(以"number"
为提示)、valueOf()
和toString()
方法(按此顺序)进行转换。左操作数始终在右操作数之前进行强制转换。请注意,虽然[Symbol.toPrimitive]()
是使用"number"
提示调用的(这意味着对象略微偏向于成为数字),但返回值不会 转换为数字,因为字符串仍然被特殊处理。 - 如果两个值都是字符串,则将其作为字符串进行比较,基于它们包含的 UTF-16 代码单元(而不是 Unicode 代码点)的值。
- 否则,JavaScript 尝试将非数字类型转换为数值
- 布尔值
true
和false
分别转换为 1 和 0。 null
转换为 0。undefined
转换为NaN
。- 字符串根据它们包含的值进行转换,如果它们不包含数值,则转换为
NaN
。
- 布尔值
- 如果任一值为
NaN
,则运算符返回false
。 - 否则,将值作为数值进行比较。BigInt 和数字值可以互相比较。
其他运算符,包括 >
、>=
和 <=
,使用与 <
相同的算法。在两种情况下,所有四个运算符都返回 false
- 如果一个操作数被转换为 BigInt,而另一个操作数被转换为无法转换为 BigInt 值的字符串(当传递给
BigInt()
时会引发 语法错误)。 - 如果一个操作数被转换为
NaN
。(例如,无法转换为数字的字符串或undefined
。)
对于所有其他情况,四个运算符具有以下关系
js
x < y === !(x >= y);
x <= y === !(x > y);
x > y === y < x;
x >= y === y <= x;
注意:<
和 >
之间的一个可观察到的区别是强制转换的顺序,特别是如果强制转换为原始值具有副作用。所有比较运算符都先强制转换左操作数,然后再强制转换右操作数。
示例
字符串到字符串比较
js
"a" < "b"; // true
"a" < "a"; // false
"a" < "3"; // false
"\uD855\uDE51" < "\uFF3A"; // true
字符串到数字比较
js
"5" < 3; // false
"3" < 3; // false
"3" < 5; // true
"hello" < 5; // false
5 < "hello"; // false
"5" < 3n; // false
"3" < 5n; // true
数字到数字比较
js
5 < 3; // false
3 < 3; // false
3 < 5; // true
数字到 BigInt 比较
js
5n < 3; // false
3 < 5n; // true
比较布尔值、null、undefined、NaN
js
true < false; // false
false < true; // true
0 < true; // true
true < 1; // false
null < 0; // false
null < 1; // true
undefined < 3; // false
3 < undefined; // false
3 < NaN; // false
NaN < 3; // false
带有副作用的比较
比较始终将其操作数强制转换为原始值。这意味着同一个对象在一个比较表达式中最终可能具有不同的值。例如,您可能有两个值,它们都大于并且小于另一个值。
js
class Mystery {
static #coercionCount = -1;
valueOf() {
Mystery.#coercionCount++;
// The left operand is coerced first, so this will return 0
// Then it returns 1 for the right operand
return Mystery.#coercionCount % 2;
}
}
const l = new Mystery();
const r = new Mystery();
console.log(l < r && r < l);
// true
警告:这可能是一个混淆的来源。如果您的对象提供自定义的原始值转换逻辑,请确保它是幂等的:多次强制转换应返回相同的值。
规范
规范 |
---|
ECMAScript 语言规范 # sec-relational-operators |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。