小于(<)

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

小于<)运算符在左操作数比右操作数小时返回 true,否则返回 false

尝试一下

console.log(5 < 3);
// Expected output: false

console.log(3 < 3);
// Expected output: false

// Compare bigint to number
console.log(3n < 5);
// Expected output: true

console.log("aa" < "ab");
// Expected output: true

语法

js
x < y

描述

操作数经过多轮强制比较,可以总结为以下几点:

首先,通过依次调用其 [Symbol.toPrimitive]()(以 "number" 作为提示)、valueOf()toString() 方法,将对象转换为原始类型。左边的操作数总是在右边的操作数之前被强制转换。请注意,尽管 [Symbol.toPrimitive]() 被调用时带有 "number" 的提示(意味着有一点倾向于将对象变成数字),但返回值并没有转换为数字,因为字符串仍然被特别处理。

  • 如果两个值都是字符串,则根据它们所包含的 Unicode 码位的值,将它们作为字符串进行比较。
  • 否则,JavaScript 会尝试将非数值类型转化为数值类型:
    • 布尔值 truefalse 分别转化为 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

字符串与数值比较

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++;
    // 左侧操作数先强制转化,所以对右操作数会先返回 0 再返回 1
    return Mystery.#coercionCount % 2;
  }
}
const l = new Mystery();
const r = new Mystery();
console.log(l < r && r < l);
// true

警告: 这可能是混乱的根源。如果你的对象提供了自定义的原始值转换逻辑,请确保它是幂等的:多次强制转化应该返回相同的值。

规范

Specification
ECMAScript® 2025 Language Specification
# sec-relational-operators

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
Less than (a < b)

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

参见