深入理解 NaN 與 isNaN 方法

一还惠、NaN

NaN,即 not a number,從字面意思上可以理解為非數(shù)字冲茸,但是在 JavaScript 的數(shù)據(jù)類型劃分的時候,我們還是將其劃分進 number 類型:

typeof NaN;    // "number"

實際上缅帘,它是在算術(shù)運算過程中轴术,在原本期望得到一個數(shù)字類型數(shù)據(jù)的地方,卻沒有辦法得出數(shù)字類型的結(jié)果的時候钦无,其它類型編程語言可能將拋出異常逗栽,而 JavaScript 將得到一個 NaN:

1 - 'a';        // NaN
1 / 'a';        // NaN
1 - {};         // NaN
1 + NaN;        // NaN
1 * {};         // NaN

但需要注意一些特殊情況:

  • JavaScript 中,+ 既是加法運算符失暂,又是字符串連接符(當操作數(shù)中含有字符串時彼宠,認為是字符串連接操作)
1 + 'a';        // '1a'
'1' + 1;        // '11'
  • 當分母為 0 的時候,將得到特殊的 Infinity 和 - Infinity
1 / 0;              // Infinity
1 / (-0);           // -Infinity
  • 操作數(shù)可能被隱式轉(zhuǎn)換
1 + {};    // "1[object Object]"

1 + new Date('2019-09-01'); 
// "1Sun Sep 01 2019 08:00:00 GMT+0800 (中國標準時間)"  

1 + [1, 2];    // '11,2'

二 弟塞、判斷是否為 NaN
在 JavaScript NaN 有一個其它類型數(shù)據(jù)都不具備的特性凭峡,這個數(shù)據(jù)與它本身不相等:

NaN == NaN;       // false
NaN === NaN;      // false

所以,我們可以基于這一點决记,來判斷一個數(shù)據(jù)是否是 NaN:

function ifNaN(data) {
  return data !== data;
}
ifNaN(NaN);        // true
ifNaN(1);          // false

三摧冀、原生的 isNaN 方法
第一感覺,isNaN 方法應該和我們前面實現(xiàn)的 ifNaN 效果一樣,但實際上二者區(qū)別卻很大:

isNaN(null);         // false
isNaN(undefined);    // true
isNaN(1);            // false
isNaN({});           // true
isNaN('123');        // false
isNaN('0xa');        // false

isNaN 的定位跟之前的 ifNaN 不太一樣索昂,ifNaN 是確定一個數(shù)據(jù)是否是 NaN建车,是 NaN 就返回 true,否則返回 false椒惨;isNaN 是確定一個數(shù)據(jù)在與其它數(shù)字類型數(shù)據(jù)進行算術(shù)運算之后癞志,是否可能得出 NaN:

null - 1;            // -1
undefined - 1;       // NaN
1 - 1;               // 0
{} - 1;              // NaN
'123' - 1;           // 121
'0xa' - 1;           // 9

這一點上,其實與上面 isNaN 的行為保持一致了框产。
在調(diào)用 isNaN 時凄杯,如果傳入的參數(shù)不是 number 類型,則會嘗試隱式轉(zhuǎn)換成 number 類型的數(shù)據(jù)秉宿,所以戒突, isNaN(xxx) 其實與 isNaN(Nunber(xxx)) 等價,所以上面 isNaN 的行為也就解釋得通了描睦。

注:最初版本的 isNaN 是定義在全局對象 window(瀏覽器環(huán)境) / global(nodejs) 對象上的膊存,但是 ES6 在 Number 構(gòu)造函數(shù)上添加了一個靜態(tài)方法 Number.isNaN,其效果與之前的 ifNaN 保持一致了忱叭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隔崎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子韵丑,更是在濱河造成了極大的恐慌爵卒,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撵彻,死亡現(xiàn)場離奇詭異钓株,居然都是意外死亡,警方通過查閱死者的電腦和手機陌僵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門轴合,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碗短,你說我怎么就攤上這事受葛。” “怎么了偎谁?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵总滩,是天一觀的道長。 經(jīng)常有香客問我搭盾,道長咳秉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任鸯隅,我火速辦了婚禮澜建,結(jié)果婚禮上向挖,老公的妹妹穿的比我還像新娘。我一直安慰自己炕舵,他們只是感情好何之,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咽筋,像睡著了一般溶推。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奸攻,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天蒜危,我揣著相機與錄音,去河邊找鬼睹耐。 笑死辐赞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的硝训。 我是一名探鬼主播响委,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窖梁!你這毒婦竟也來了赘风?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤纵刘,失蹤者是張志新(化名)和其女友劉穎邀窃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彰导,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蛔翅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年敲茄,在試婚紗的時候發(fā)現(xiàn)自己被綠了位谋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡堰燎,死狀恐怖掏父,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秆剪,我是刑警寧澤赊淑,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站仅讽,受9級特大地震影響陶缺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洁灵,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一饱岸、第九天 我趴在偏房一處隱蔽的房頂上張望掺出。 院中可真熱鬧,春花似錦苫费、人聲如沸汤锨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闲礼。三九已至,卻和暖如春铐维,著一層夾襖步出監(jiān)牢的瞬間柬泽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工嫁蛇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留聂抢,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓棠众,卻偏偏與公主長得像琳疏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子闸拿,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 全面認識JavaScript的Number對象 首先一個是對JavaScript中Number的理解:JavaSc...
    皮皮坤666閱讀 795評論 0 0
  • 第一章 前端三大語言:HTML(專門編寫網(wǎng)頁內(nèi)容)空盼、CSS(編寫網(wǎng)頁樣式)、JS(專門編寫網(wǎng)頁交互行為) 能簡寫盡...
    fastwe閱讀 931評論 0 0
  • 變量 聲明變量 命名變量區(qū)分大小寫的語言第一個字符是字母或下劃線_,數(shù)字不能作為第一個字符字符必須是字母新荤,數(shù)字或者...
    flyingtoparis閱讀 797評論 0 0
  • 標簽: 我的筆記 ---學習資料:http://javascript.ruanyifeng.com/ 1. 導論 ...
    暗夜的怒吼閱讀 793評論 0 1
  • JavaScript語言精粹 前言 約定:=> 表示參考相關(guān)文章或書籍; JS是JavaScript的縮寫揽趾。 本書...
    微笑的AK47閱讀 576評論 0 3