Implicit casting
JS tự động ép kiểu, có thể gây bug khó debug
Bạn chỉ định rõ muốn đổi sang kiểu gì — code rõ ràng, dễ bảo trì và ít bug hơn coercion ngầm.
Number("3.14"); // 3.14 (chuẩn, fail → NaN)parseInt("08", 10); // 8 (NHỚ truyền radix)parseFloat("2.5px"); // 2.5 (dừng ở chỗ không phải số)+"42"; // 42 (nhanh nhưng kém rõ ràng)| Phương thức | Xử lý thập phân | Dừng ở ký tự không phải số | Khuyến nghị |
|---|---|---|---|
Number() | Có | Không (trả về NaN) | Hầu hết trường hợp |
parseInt() | Không | Có | Lấy số nguyên |
parseFloat() | Có | Có | Lấy số thập phân |
+value | Có | Không | Nhanh nhưng kém rõ |
String(123); // "123"(123).toString(); // "123"123 + ""; // "123" (ép ngầm)Boolean(0); // falseBoolean("hi"); // true!!value; // shorthand (double NOT)JavaScript gọi tuần tự valueOf() rồi toString(); bạn có thể override:
const money = { amount: 1000, valueOf() { return this.amount; }};money + 500; // 1500Dùng === thay cho == để tránh coercion ngoài ý muốn
// BADif (value == null) { }
// GOODif (value === null || value === undefined) { }Khi cần số thực, ưu tiên Number(); khi cần nguyên từ chuỗi, dùng parseInt(str, 10)
const price = Number("19.99"); // 19.99const age = parseInt("25", 10); // 25Ép tường minh ở rìa hệ thống (input UI/API/file) thay vì trông chờ JS ép hộ
const userInput = document.getElementById("age").value;const age = Number(userInput);
if (isNaN(age)) { console.error("Invalid age");}Tránh trộn BigInt với Number trong 1 biểu thức
1n + 1; // TypeError1n + BigInt(1); // OK: 2nfunction validateAge(input) { const age = Number(input);
if (isNaN(age)) { return "Vui lòng nhập số hợp lệ"; }
if (age < 0 || age > 150) { return "Tuổi không hợp lệ"; }
return "OK";}// BAD - coercion không mong muốnif (userInput == 0) { }
// GOOD - explicit checkif (Number(userInput) === 0) { }// Data từ API thường là stringconst apiResponse = { price: "19.99", quantity: "5"};
// Ép kiểu tường minhconst total = Number(apiResponse.price) * Number(apiResponse.quantity);console.log(total); // 99.95Implicit casting
JS tự động ép kiểu, có thể gây bug khó debug
Explicit casting
Bạn kiểm soát, code rõ ràng hơn