Less than (<)
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.
Toán tử less than (<) trả về true nếu toán hạng bên trái nhỏ hơn toán hạng bên phải, và false trong các trường hợp còn lại.
Try it
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
Cú pháp
x < y
Mô tả
Các toán hạng được so sánh qua nhiều vòng ép kiểu, có thể tóm tắt như sau:
- Trước tiên, các object được chuyển đổi sang kiểu primitive bằng cách gọi các phương thức
[Symbol.toPrimitive]()(với gợi ý"number"),valueOf(), vàtoString(), theo thứ tự đó. Toán hạng bên trái luôn được ép kiểu trước toán hạng bên phải. Lưu ý rằng mặc dù[Symbol.toPrimitive]()được gọi với gợi ý"number"(nghĩa là có ưu tiên nhỏ để object trở thành số), giá trị trả về không được chuyển đổi thành số, vì string vẫn được xử lý đặc biệt. - Nếu cả hai giá trị đều là string, chúng được so sánh như string, dựa trên giá trị của các đơn vị code UTF-16 (không phải code point Unicode) mà chúng chứa.
- Nếu không, JavaScript cố gắng chuyển đổi các kiểu không phải số sang giá trị số:
- Giá trị boolean
truevàfalseđược chuyển đổi thành 1 và 0 tương ứng. nullđược chuyển đổi thành 0.undefinedđược chuyển đổi thànhNaN.- String được chuyển đổi dựa trên các giá trị mà chúng chứa, và được chuyển đổi thành
NaNnếu chúng không chứa giá trị số.
- Giá trị boolean
- Nếu một trong hai giá trị là
NaN, toán tử trả vềfalse. - Nếu không, các giá trị được so sánh như giá trị số. Giá trị BigInt và number có thể được so sánh cùng nhau.
Các toán tử khác, bao gồm >, >=, và <=, sử dụng cùng thuật toán như <. Có hai trường hợp mà tất cả bốn toán tử đều trả về false:
- Nếu một trong các toán hạng được chuyển đổi thành BigInt, trong khi toán hạng kia được chuyển đổi thành một string không thể chuyển đổi thành giá trị BigInt (nó ném ra lỗi cú pháp khi truyền vào
BigInt()). - Nếu một trong các toán hạng được chuyển đổi thành
NaN. (Ví dụ: string không thể chuyển đổi thành số, hoặcundefined.)
Đối với tất cả các trường hợp khác, bốn toán tử có các mối quan hệ sau:
x < y === !(x >= y);
x <= y === !(x > y);
x > y === y < x;
x >= y === y <= x;
Note:
Một sự khác biệt có thể quan sát được giữa < và > là thứ tự ép kiểu, đặc biệt là nếu việc ép kiểu sang primitive có tác dụng phụ. Tất cả các toán tử so sánh đều ép kiểu toán hạng bên trái trước toán hạng bên phải.
Ví dụ
>So sánh string với string
"a" < "b"; // true
"a" < "a"; // false
"a" < "3"; // false
"\uD855\uDE51" < "\uFF3A"; // true
So sánh string với number
"5" < 3; // false
"3" < 3; // false
"3" < 5; // true
"hello" < 5; // false
5 < "hello"; // false
"5" < 3n; // false
"3" < 5n; // true
So sánh number với number
5 < 3; // false
3 < 3; // false
3 < 5; // true
So sánh number với BigInt
5n < 3; // false
3 < 5n; // true
So sánh Boolean, null, undefined, NaN
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
So sánh với tác dụng phụ
So sánh luôn ép kiểu các toán hạng của chúng sang kiểu primitive. Điều này có nghĩa là cùng một object có thể kết thúc với các giá trị khác nhau trong một biểu thức so sánh. Ví dụ, bạn có thể có hai giá trị mà cả hai đều lớn hơn và nhỏ hơn giá trị kia.
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
Warning: Đây có thể là nguồn gây nhầm lẫn. Nếu object của bạn cung cấp logic chuyển đổi primitive tùy chỉnh, hãy đảm bảo rằng nó idempotent: nhiều lần ép kiểu nên trả về cùng một giá trị.
Thông số kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-relational-operators> |