小於 (<)

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

瀏覽器相容性

另見