isNaN() - Kiểm tra giá trị NaN
isNaN() kiểm tra xem giá trị có phải là NaN (Not-a-Number) hay không. Lưu ý: isNaN() có hành vi kỳ lạ do ép kiểu.
Ví dụ từ bài gốc
function multiply(firstValue, secondValue, callback) {
const res = firstValue * secondValue;
// isNaN(res) trả về true nếu res là NaN
const err = isNaN(res) ? 'Tham số đầu vào không hợp lệ' : undefined;
callback(res, err);
}
multiply(10, 50, (result, error) => {
console.log('Kết quả nhân = ' + result);
if (error) console.log(error);
});
multiply('Sam', 5, (result, error) => {
console.log('Kết quả nhân = ' + result); // NaN
if (error) console.log(error); // "Tham số đầu vào không hợp lệ"
});
Chạy với Node.js
# Lưu file demo.js, chạy:
node demo.js
# Output:
# Kết quả nhân = 500
# Kết quả nhân = NaN
# Tham số đầu vào không hợp lệ
Vấn đề của isNaN() toàn cục
// isNaN() ÉP KIỂU THAM SỐ THÀNH SỐ TRƯỚC KHI KIỂM TRA
isNaN(NaN); // true
isNaN('hello'); // true ('hello' -> NaN)
isNaN('123'); // false ('123' -> 123)
isNaN(undefined); // true (undefined -> NaN)
isNaN({}); // true (object -> NaN)
isNaN([]); // false ([] -> '' -> 0) !!
isNaN([1]); // false ([1] -> '1' -> 1) !!
isNaN([1,2]); // true ([1,2] -> '1,2' -> NaN)
Giải pháp: Number.isNaN() (ES6) - Khuyến nghị
// Number.isNaN() KHÔNG ép kiểu - chỉ trả về true cho chính xác NaN
Number.isNaN(NaN); // true
Number.isNaN('hello'); // false
Number.isNaN('123'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Number.isNaN([]); // false
Number.isNaN(0/0); // true
So sánh
| Giá trị | isNaN() | Number.isNaN() |
|---|---|---|
| NaN | true | true |
| 'abc' | true | false |
| '123' | false | false |
| undefined | true | false |
| {} | true | false |
| [] | false | false |
| null | false | false |
Kiểm tra "là số hợp lệ" (isFinite)
// Kiểm tra: là số VÀ không phải NaN/Infinity
Number.isFinite(123); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite('123'); // false (không ép kiểu)
// Global isFinite() ÉP KIỂU
isFinite('123'); // true
isFinite(null); // true (null -> 0)
Best Practice
// Hàm kiểm tra số hợp lệ an toàn
function isValidNumber(value) {
return typeof value === 'number' && Number.isFinite(value);
}
// Hoặc cho phép string số
function isNumeric(value) {
return !isNaN(value) && !isNaN(parseFloat(value)) && isFinite(value);
}