Toán tử so sánh trả về true hoặc false. JS có 2 loại: Loose Equality (==, !=) có ép kiểu, và Strict Equality (===, !==) không ép kiểu – luôn dùng strict.
Danh sách toán tử
| Toán tử | Tên | Mô tả | Ví dụ (a=10, b=20) |
|---|---|---|---|
== | Loose Equal | So sánh giá trị SAU KHI ÉP KIỂU | 10 == "10" → true ⚠️ |
=== | Strict Equal | So sánh GIÁ TRỊ VÀ KIỂU (không ép kiểu) | 10 === "10" → false ✅ |
!= | Loose Not Equal | Ngược của == | 10 != "10" → false ⚠️ |
!== | Strict Not Equal | Ngược của === | 10 !== "10" → true ✅ |
> | Greater Than | Lớn hơn (có ép kiểu) | 10 > 20 → false |
< | Less Than | Nhỏ hơn (có ép kiểu) | 10 < 20 → true |
>= | Greater or Equal | Lớn hơn hoặc bằng | 10 >= 20 → false |
<= | Less or Equal | Nhỏ hơn hoặc bằng | 10 <= 20 → true |
Quy tắc ép kiểu của == (Abstract Equality)
null == undefined→true(đặc biệt).- Số so với chuỗi: chuỗi → số (
"10" == 10→ true). - Boolean so với bất kỳ: boolean → số (
true == 1→ true,false == 0→ true). - Object so với primitive: object → primitive (valueOf/toString).
// Các trường hợp "khoái" của ==
"" == 0; // true
"" == false; // true
0 == false; // true
"0" == false; // true
null == undefined; // true
null == 0; // false!
undefined == 0; // false!
[] == ""; // true
[] == 0; // true
[0] == false; // true
[1] == true; // true
"1" == true; // true
Tại sao TRÁNH == và !=?
- Khó dự đoán, gây bug ngầm.
- Không đối xứng trong một số trường hợp hiếm.
- Làm code khó đọc, khó bảo trì.
- ESLint rule
eqeqeqkhuyến nghị===/!==.
So sánh Object
{} === {}; // false (khác tham chiếu)
const a = {}; a === a; // true (cùng tham chiếu)
[1,2] == "1,2"; // true! (array → "1,2" → so sánh string)
[1,2] === "1,2"; // false (khác kiểu)
Object.is() (ES6) – So sánh chính xác nhất
Object.is(10, 10); // true
Object.is(10, "10"); // false
Object.is(NaN, NaN); // true! (=== cho false)
Object.is(0, -0); // false! (=== cho true)
Object.is(+0, -0); // false
Ví dụ demo từ bài gốc
<script>
var a = 10, b = 20;
var br = "<br />";
document.write("(a == b) => " + (a == b) + br); // false
document.write("(a === b) => " + (a === b) + br); // false
document.write("(a != b) => " + (a != b) + br); // true
document.write("(a !== b) => " + (a !== b) + br); // true
document.write("(a < b) => " + (a < b) + br); // true
document.write("(a > b) => " + (a > b) + br); // false
document.write("(a <= b) => " + (a <= b) + br); // true
document.write("(a >= b) => " + (a >= b) + br); // false
</script>
Best Practice
- Luôn dùng
===và!==– dự đoán được, nhanh hơn (không ép kiểu). - Dùng
Object.is()khi cần phân biệtNaN,+0,-0. - Chỉ dùng
== null/!= nullđể checknullORundefined(idiom chấp nhận được). - So sánh object: dùng
JSON.stringify()(shallow),lodash.isEqual()(deep), hoặc so sánh field cụ thể.