So sánh String và Boolean trong JavaScript có hành vi đặc biệt do type coercion (ép kiểu) của toán tử == (loose equality).
Kết quả với == (loose equality)
false == "0" // true (false → 0, "0" → 0)
true == "1" // true (true → 1, "1" → 1)
false == "" // true (false → 0, "" → 0)
false == "false" // false ("false" → NaN, 0 != NaN)
true == "true" // false ("true" → NaN, 1 != NaN)
true == "1" // true
false == " " // true (space → 0)
false == [] // true ([] → "" → 0)
true == [1] // true ([1] → "1" → 1)
Kết quả với === (strict equality)
false === "0" // false (khác kiểu) true === "1" // false false === "" // false
Chuyển đổi tường minh (Explicit conversion)
var data = true;
// So sánh string "true"
data === "true" // false (boolean vs string)
String(data) === "true" // true (chuyển boolean → string)
data.toString() === "true" // true
// So sánh boolean từ string
Boolean("true") // true (string không rỗng → true)
"true" === "true" // true (so sánh string)
!!"true" // true
Khuyến nghị:
- Luôn dùng
===(strict equality) — tránh ép kiểu ngầm. - Nếu cần so sánh boolean với string: chuyển đổi tường minh
String(bool)hoặcBoolean(str). Boolean("false")làtrue(string không rỗng) — cẩn thận!