Loose Equality Operator (==)
== là gì?
Phần tiêu đề “== là gì?”Toán tử == (loose equality) so sánh giá trị giữa hai toán hạng sau khi JavaScript tự động chuyển đổi kiểu dữ liệu (type coercion) nếu cần.
"5" == 5; // true — "5" bị ép thành 50 == false; // true — false bị ép thành 0Quy tắc ép kiểu của ==
Phần tiêu đề “Quy tắc ép kiểu của ==”JavaScript thực hiện ép kiểu theo thuật toán Abstract Equality Comparison (spec ECMA-262):
Nếu hai toán hạng cùng kiểu, == hoạt động giống hệt ===:
5 == 5; // true"hello" == "hello"; // truenull == null; // truenull và undefined chỉ bằng nhau với chính nó và với nhau:
null == undefined; // truenull == 0; // falseundefined == ""; // falseundefined == false; // falseString → Number trước khi so sánh:
"42" == 42; // true — "42" → 42"" == 0; // true — "" → 0"abc" == NaN; // false — "abc" → NaNBoolean → Number trước (true → 1, false → 0), rồi so sánh tiếp:
true == 1; // true — true → 1false == 0; // true — false → 0true == "1"; // true — true → 1, "1" → 1false == ""; // true — false → 0, "" → 0Object gọi valueOf() hoặc toString() để chuyển về primitive:
[1] == 1; // true — [1].toString() → "1" → 1[1,2] == "1,2"; // true — [1,2].toString() → "1,2"Sơ đồ quy tắc
Phần tiêu đề “Sơ đồ quy tắc”a == b│├─ Cùng kiểu? → So sánh giống ===│├─ null/undefined? → null == undefined = true, còn lại false│├─ Number vs String? → String → Number│├─ Boolean? → Boolean → Number, rồi so sánh lại│└─ Object vs Primitive? → Object → toPrimitive(), rồi so sánh lạiCác trường hợp “khó tin” (wtf)
Phần tiêu đề “Các trường hợp “khó tin” (wtf)”"" == 0; // true — "" → 0"0" == false; // true — false → 0, "0" → 0"\t\n" == 0; // true — whitespace → 0[] == false; // true — [] → "" → 0, false → 0[] == ![]; // true — ![] → false → 0, [] → "" → 0Khi nào == thực sự hữu ích?
Phần tiêu đề “Khi nào == thực sự hữu ích?”Trường hợp duy nhất mà == được cộng đồng chấp nhận:
// Kiểm tra null hoặc undefined cùng lúcif (x == null) { // x là null HOẶC undefined}
// Tương đương với:if (x === null || x === undefined) { // ...}Tóm tắt
Phần tiêu đề “Tóm tắt”| Quy tắc | Ví dụ | Kết quả |
|---|---|---|
Cùng kiểu → giống === | 5 == 5 | true |
null == undefined | null == undefined | true |
| String → Number | "5" == 5 | true |
| Boolean → Number | true == 1 | true |
| Object → toPrimitive | [1] == 1 | true |