Movatterモバイル変換


[0]ホーム

URL:


  1. 面向开发者的 Web 技术
  2. JavaScript
  3. JavaScript 参考
  4. 表达式和运算符
  5. 小于(<)

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in EnglishAlways switch to English

小于(<)

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月⁩.

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

尝试一下

console.log(5 < 3);// Expected output: falseconsole.log(3 < 3);// Expected output: false// Compare bigint to numberconsole.log(3n < 5);// Expected output: trueconsole.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; // false5 < "hello"; // false"5" < 3n; // false"3" < 5n; // true

数值之间的比较

js
5 < 3; // false3 < 3; // false3 < 5; // true

数值与 BigInt 之间的比较

js
5n < 3; // false3 < 5n; // true

比较布尔值、null、undefined 和 NaN

js
true < false; // falsefalse < true; // true0 < true; // truetrue < 1; // falsenull < 0; // falsenull < 1; // trueundefined < 3; // false3 < undefined; // false3 < NaN; // falseNaN < 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® 2026 Language Specification
# sec-relational-operators

浏览器兼容性

参见

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp