Js面試篇3、關於javascript中的NaN和isNaN()

本文章內容:javascript

  • 什麼是NaN以及產生NaN的場景
  • 關於isNan()方法

NaN是什麼?

NaN(Not a Number)是一個特殊的數值,這個數值用於表示一個原本要返回數值的操做數爲返回數值的狀況。 在javascript中,整數和浮點數統稱爲Number類型,除此以外Number類型還有一個特殊的值就是NaN,它是對象Number的一個靜態屬性,經過Number.NaN能夠訪問到。java

NaN自己有兩個非同尋常的特色:es6

  1. 任何涉及NaN的操做(例如NaN/10)都會返回NaN,這個特色在多不計算中可能會致使問題。
  2. NaN與任何值都不相等,包括NaN自己。

產生NaN的兩個場景:

一、表達式計算

一個表達式中有減號(-)、乘號(✖)、或除號(➗)等運算符時,JS引擎在計算以前會試圖將表達式的每一項轉化爲Number類型,使用Number()作轉換,若是轉換失敗則返回NaN。bash

100 - '1a'; // NaN
'100' / '10a'; // NaN
'10a' * 5; //NaN
undefined - 1; //NaN ===> Number(undefined) NaN
[] * 10; // 0, ====> Number([]) = 0
null - 5; // -5 ====> Number(null) = 0
複製代碼
二、類型轉換

直接使用parseInt、parseFloat或者Number講一個給數字的值轉化爲數字時,表達式返回NaN.函數

'abc' - 1; // NaN
parseInt('abc'); // NaN
parseFloat('abc'); // NaN
Number('abc'); //NaN
複製代碼

對於數字 + 字符的值,其轉化結果會有不一樣。ui

Number('123abc'); // NaN
parseInt('123abc'); // 123
parseInt('123abc45'); // 123
parseFloat('123.45abc'); // 123.45
複製代碼

Number轉化的是整個值而不是部分值,parseInt和parseFloat只轉化第一個無效字符以前的字符串。另外,一元操做符也能夠實現與Number相同的做用:spa

+'123abc'; // NaN
+'123'; // 123
+'123.78'; // 123.78
+'abc'; // NaN
複製代碼

isNaN()

isNaN()是一個全局方法,它的做用是差一個值是否能被Number()成功轉換,若是能轉換成功就返回false,不然返回true.code

isNaN(NaN); // true 不能被Number()轉換,全部結果爲true
isNaN('123'); // false 能被Number()成功轉換,因此IsNaN函數最終返回false
isNaN('123abc'); // true
isNaN('123.45ab'); // true
複製代碼

由上可見,isNaN()方法並不能判斷一個值是否爲NaN,若是想判斷某個值是否爲NaN,能夠利用NaN不等於自身的特殊性質:對象

function selfIsNaN(num) {
    return value != value
}
複製代碼

可是,在es6中,Number對象上也提供了isNaN()方法,和全局isNaN()不一樣的是,它用於判斷某個值自己是否爲NaN,而不須要進行類型轉換。用法以下:ip

Number.isNaN('123'); // false, 自己不是NaN
Number.isNaN('abc'); // false, 自己不是NaN
Number.isNaN(NaN); // true, 是
複製代碼
相關文章
相關標籤/搜索