小於 (<)
小於 (<) 運算子在左運算元小於右運算元時返回 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 會嘗試將非數字型別轉換為數字值:
- 布林值
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® 2026 語言規範 # sec-relational-operators |
瀏覽器相容性
載入中…