Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Kiểm tra số không hợp lệ (NaN) với isNaN() trong JavaScript

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()
NaNtruetrue
'abc'truefalse
'123'falsefalse
undefinedtruefalse
{}truefalse
[]falsefalse
nullfalsefalse

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);
}