小于 (<)

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

小于 (<) 运算符在左操作数小于右操作数时返回 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" 提示下被调用(这意味着对象略微倾向于成为数字),但返回值不会转换为数字,因为字符串仍会进行特殊处理。
  • 如果两个值都是字符串,它们将根据其包含的 UTF-16 码元(而非 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

"\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® 2026 语言规范
# sec-relational-operators

浏览器兼容性

另见