NaN (Not-a-Number) và Infinity là hai giá trị đặc biệt của kiểu Number trong JavaScript.
1. NaN - Not a Number
- Kết quả của phép toán số học không hợp lệ
typeof NaN === "number"(đây là một "feature" nổi tiếng)NaN !== NaN- NaN không bằng chính nó!- Kiểm tra:
Number.isNaN(value)(ES6) hoặcisNaN(value)(global, có ép kiểu)
2. Infinity - Vô cực
- Kết quả chia cho 0 hoặc vượt quá giới hạn số
Infinity === Infinitylà true- Kiểm tra:
Number.isFinite(value)trả về false cho Infinity/NaN
Ví dụ minh họa
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>NaN và Infinity JS</title>
<style>
body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
.result { font-size: 20px; font-weight: 500; margin: 10px 0; color: green; }
button { padding: 8px 16px; cursor: pointer; }
</style>
</head>
<body>
<h1>NaN và Infinity trong JavaScript</h1>
<div class="result" id="result"></div>
<button class="btn" id="btn">NHẤN VÀO ĐÂY</button>
<h3> Nhấn nút để xem ví dụ NaN và Infinity </h3>
<script>
const resEle = document.querySelector("#result");
document.querySelector("#btn").addEventListener("click", () => {
// Infinity: chia cho 0
resEle.innerHTML = "9 / 0 = " + (9 / 0) + "
"; // Infinity
// NaN: ép kiểu chuỗi không phải số thành Number
resEle.innerHTML += 'Number("AJKL") = ' + Number("AJKL") + "
"; // NaN
// Thêm các ví dụ khác
resEle.innerHTML += "
--- Kiểm tra ---
";
resEle.innerHTML += "NaN === NaN: " + (NaN === NaN) + "
"; // false
resEle.innerHTML += "Number.isNaN(NaN): " + Number.isNaN(NaN) + "
"; // true
resEle.innerHTML += "isNaN('hello'): " + isNaN("hello") + "
"; // true (global isNaN ép kiểu)
resEle.innerHTML += "Number.isNaN('hello'): " + Number.isNaN("hello") + "
"; // false (ES6 không ép kiểu)
resEle.innerHTML += "Infinity === Infinity: " + (Infinity === Infinity) + "
"; // true
resEle.innerHTML += "Number.isFinite(Infinity): " + Number.isFinite(Infinity) + "
"; // false
resEle.innerHTML += "Number.isFinite(NaN): " + Number.isFinite(NaN) + "
"; // false
resEle.innerHTML += "Number.isFinite(123): " + Number.isFinite(123) + "
"; // true
});
</script>
</body>
</html>
Kết quả
9 / 0 = Infinity
Number("AJKL") = NaN
--- Kiểm tra ---
NaN === NaN: false
Number.isNaN(NaN): true
isNaN('hello'): true
Number.isNaN('hello'): false
Infinity === Infinity: true
Number.isFinite(Infinity): false
Number.isFinite(NaN): false
Number.isFinite(123): true
Bảng tóm tắt:
| Giá trị | typeof | === chính nó | isNaN() | Number.isNaN() | Number.isFinite() |
|---|---|---|---|---|---|
| NaN | "number" | false | true | true | false |
| Infinity | "number" | true | false | false | false |
| -Infinity | "number" | true | false | false | false |
| 123 | "number" | true | false | false | true |
| "abc" | "string" | - | true* | false | false* |
* global isNaN/isFinite ép kiểu đối số thành Number trước khi kiểm tra
Best Practice: Luôn dùng Number.isNaN() và Number.isFinite() (ES6) thay vì phiên bản global.