Đây là một trong những khái niệm cơ bản nhất nhưng cũng dễ gây nhầm lẫn cho người mới: toán tử gán (=) khác hoàn toàn với toán tử so sánh lỏng lẻo (==).
Bảng so sánh nhanh
| Toán tử | Tên gọi | Chức năng | Trả về |
|---|---|---|---|
= | Assignment (Gán) | Gán giá trị bên phải cho biến bên trái | Giá trị vừa gán |
== | Loose Equality (So sánh lỏng) | So sánh giá trị sau khi ép kiểu | true / false |
=== | Strict Equality (So sánh chặt) | So sánh cả giá trị và kiểu dữ liệu | true / false |
Ví dụ minh họa
<html>
<body>
<p id="demo"></p>
<script>
var x = 5; // Toán tử gán: x nhận giá trị 5
var y = "6"; // Toán tử gán: y nhận chuỗi "6"
document.write("x = " + x + "<br>"); // 5
// Toán tử == : ép kiểu "6" thành số 6 rồi so sánh
document.getElementById("demo").innerHTML = (x == y); // false (5 != 6)
// So sánh thêm với ===
document.write("x === y: " + (x === y) + "<br>"); // false (number !== string)
document.write("x == 5: " + (x == 5) + "<br>"); // true
document.write("x === 5: " + (x === 5) + "<br>"); // true
</script>
</body>
</html>
Cơ chế ép kiểu của == (Type Coercion)
Khi so sánh hai giá trị khác kiểu, == sẽ cố gắng chuyển chúng về cùng kiểu (thường là số) trước khi so sánh:
5 == "5"→true(chuỗi "5" thành số 5)true == 1→truefalse == 0→truenull == undefined→true(quy tắc đặc biệt)"" == 0→true
Tại sao nên tránh == và dùng ===?
- Dự đoán được hành vi:
===không ép kiểu, logic so sánh minh bạch. - Tránh bug tinh vi: Ví dụ
"" == 0làtruenhưng"" === 0làfalse. - Hiệu năng:
===nhanh hơn một chút do bỏ qua bước ép kiểu. - Quy tắc code style: Hầu hết style guide (Airbnb, Google, Standard) đều yêu cầu dùng
===.
Mẹo nhớ
=là một gạch ngang → một chiều (gán từ phải sang trái).==là hai gạch ngang → so sánh hai giá trị (có ép kiểu).===là ba gạch ngang → so sánh ba yếu tố: giá trị, kiểu, và... chặt chẽ hơn.