判斷變量是否為nan的方法有三種:1.使用isnan()函數需注意類型轉換問題;2.使用es6的number.isnan()更精準;3.利用nan不等于自身的特性。isnan()會嘗試將值轉為數字,如isnan(“hello”)返回true,因此需結合typeof判斷類型;number.isnan()直接檢測是否為nan,不會進行類型轉換,推薦使用;通過val !== val可判斷nan,但可讀性差。處理可能返回nan的運算時,應提前驗證輸入或用number.isnan()處理結果。nan不等于自身是因ieee 754標準定義其表示無效數值,用于傳播錯誤信息。nan可用于表示缺失或未知值,但需確保代碼正確處理該值。
JavaScript中判斷變量是否為NaN,核心在于利用isNaN()函數以及一些巧妙的類型轉換和比較。NaN是JavaScript中一個特殊的數值,表示“非數值”(Not-a-Number)。直接使用===運算符判斷變量是否等于NaN是行不通的,因為NaN !== NaN。
isNaN()函數,Number.isNaN()函數,以及利用NaN的唯一性進行判斷。
isNaN()函數的坑與正確使用姿勢
isNaN()函數是JavaScript早期版本就存在的函數,它的判斷邏輯并非直接判斷變量是否為NaN,而是嘗試將變量轉換為數值,如果轉換失敗,則返回true。這就會導致一些意想不到的結果。比如,isNaN(“hello”)會返回true,因為”hello”無法轉換為數值。而isNaN(“123”)會返回false,因為它能成功轉換為數值123。
因此,在使用isNaN()函數時,需要注意傳入的變量類型。最好先使用typeof運算符判斷變量是否為number類型,再使用isNaN()函數進行判斷。
function isReallyNaN(val) { return typeof val === 'number' && isNaN(val); } console.log(isReallyNaN(NaN)); // true console.log(isReallyNaN("hello")); // false console.log(isReallyNaN("123")); // false console.log(isReallyNaN(123)); // false
Number.isNaN():更精確的NaN檢測
ES6引入了Number.isNaN()函數,它修復了isNaN()函數的缺陷。Number.isNaN()函數直接判斷變量是否為NaN,而不會進行類型轉換。只有當變量的值確實是NaN時,才會返回true。
console.log(Number.isNaN(NaN)); // true console.log(Number.isNaN("hello")); // false console.log(Number.isNaN("123")); // false console.log(Number.isNaN(123)); // false
Number.isNaN()函數是判斷變量是否為NaN的最佳選擇。
利用NaN的唯一性:自比較法
由于NaN !== NaN,我們可以利用這個特性來判斷變量是否為NaN。如果一個變量不等于它自身,那么它就是NaN。
function isNaNBySelfComparison(val) { return val !== val; } console.log(isNaNBySelfComparison(NaN)); // true console.log(isNaNBySelfComparison("hello")); // false console.log(isNaNBySelfComparison("123")); // false console.log(isNaNBySelfComparison(123)); // false
這種方法簡潔明了,但可讀性稍差。在實際開發中,建議使用Number.isNaN()函數。
如何處理可能返回NaN的運算?
在進行數值運算時,需要注意某些運算可能會返回NaN。例如,0/0、math.sqrt(-1)等。在進行這些運算之前,應該先對輸入進行驗證,避免產生NaN。或者,在運算之后,使用Number.isNaN()函數檢查結果是否為NaN,并進行相應的處理。
function safeDivide(a, b) { if (b === 0) { return 0; // 或者拋出異常,或者返回一個默認值 } const result = a / b; return Number.isNaN(result) ? 0 : result; } console.log(safeDivide(10, 0)); // 0 console.log(safeDivide(10, 2)); // 5
為什么NaN !== NaN?
這涉及到IEEE 754浮點數標準的定義。NaN表示的是一類特殊的數值,它代表的是無效的、未定義的或者不可表示的數值結果。由于NaN本身就代表著“非數值”,因此它不應該等于任何值,包括它自身。這種設計是為了確保NaN能夠正確地傳播錯誤信息。如果NaN === NaN,那么我們就無法區分一個有效的數值和一個無效的數值。
NaN在實際開發中的應用場景
雖然NaN通常表示錯誤,但在某些情況下,它可以用于表示缺失值或者未知值。例如,在處理用戶輸入時,如果用戶沒有輸入數值,我們可以將該字段的值設置為NaN。在數據分析中,NaN可以用于表示缺失的數據點。
需要注意的是,在使用NaN表示缺失值或者未知值時,需要確保代碼能夠正確地處理NaN。例如,在進行數值運算時,需要先使用Number.isNaN()函數檢查操作數是否為NaN,避免產生錯誤的結果。