摘要:有一次項目中發(fā)現(xiàn)原來和是有著不一樣的判斷結(jié)果。要了解他們的區(qū)別,首先得明確到底是什么在的官方解釋中是一個全局代表的值。目前的結(jié)論的類型是,這還是有點令人困惑。但從我們上述對的理解來看,這樣的判斷顯然不正確。
有一次項目中發(fā)現(xiàn)原來isNaN和Number.isNaN是有著不一樣的判斷結(jié)果。記錄一下避免下次踩坑。
要了解他們的區(qū)別,首先得明確NaN到底是什么?
在MDN的官方解釋中
The global NaN property is a value representing Not-A-Number.
NaN是一個全局代表“Not-A-Number”的值。這樣的解釋個人覺得還是有些模糊。
在You-Dont-Know-JS中給出了更詳細的解釋:
NaN literally stands for "not a number", though this label/description is very poor and misleading, as we"ll see shortly. It would be much more accurate to think of NaN as being "invalid number," "failed number," or even "bad number," than to think of it as "not a number."
大家應(yīng)該也知道:typeof NaN === "number"。
那么結(jié)合"invalid number"、"failed number"、"bad number"等描述說明NaN首先得是一個Number類型的值,其次再判斷是不是“not a number”。
目前的結(jié)論:”not-a-number“的類型是number,這還是有點令人困惑。我們來看下的You-Dont-Know-JS中的場景描述:(怕翻譯產(chǎn)生歧義還是直接貼了原文)
NaN is a kind of "sentinel value" (an otherwise normal value that"s assigned a special meaning) that represents a special kind of error condition within the number set. The error condition is, in essence: "I tried to perform a mathematic operation but failed, so here"s the failed number result instead."
再來看一個例子:
var a = 2 / "foo"; // NaN typeof a === "number"; // true
看到這里相信大家對NaN已經(jīng)有了較為完整的認識。那么我們?nèi)绾蝸砼袛嘤嬎惝a(chǎn)生的結(jié)果是NaN呢?
JS原生提供了isNaN的方法,拿上面的例子來舉例:
var a = 2 / "foo"; isNaN(a) // true;
看似沒什么問題,但其實isNaN是有著致命的缺陷。它把對NaN的判斷就如同字面意思所寫的那樣:test if the thing passed in is either not a number or is a number。但從我們上述對NaN的理解來看,這樣的判斷顯然不正確。
例如:
var a = 2 / "foo"; var b = "foo"; a; // NaN b; // "foo" window.isNaN( a ); // true window.isNaN( b ); // true
b顯然是一個字符串,從我們之前對NaN的定義(NaN的類型是number)來看,b明顯不應(yīng)該是NaN。這個Bug由來許久,所以在es6中提供了替代方案Number.isNaN。我們來看下polyfill就知道他修復(fù)了什么問題。
if (!Number.isNaN) { Number.isNaN = function(n) { return ( typeof n === "number" && window.isNaN(n) ); }; }
再試驗下剛才的例子:
var a = 2 / "foo"; var b = "foo" Number.isNaN(a); // true Number.isNaN(b); // false
就能得出我們理想的結(jié)果了。
還有一種polyfill非常簡單,利用了NaN不等于他自身的特性,NaN是唯一有此特性的值,其他值都等于它們自身(包括undefined和null):
if (!Number.isNaN) { Number.isNaN = function(n) { return n !== n; }; }
最后就是建議大家都使用Number.isNaN來進行判斷,如果用了eslint的話,那只寫isNaN是會報錯的哦。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/107904.html
摘要:但是跟普通的是的不一樣的是,代表這一意義。的沒有的情況下,可以采用以下簡單來看,就是在原有的基礎(chǔ)上增加了一個的判斷,因為的是。還有一種更加簡單的實現(xiàn)利用了只有不跟自己相等的特性。不過我們可以通過以上方式來解釋判斷為什么會出現(xiàn)這樣的情況了。 例子 大家先看一看下面這個例子, isNaN(NaN); isNaN(A String); isNaN(undefined); isNaN({...
摘要:全局屬性表示的值,顧名思義,就是表示不是一個數(shù)字。值得注意的是,是引入的,可以用上面的。而能通過函數(shù)的只有。該認為,應(yīng)該返回。 這篇文章并不在我的 underscore 源碼解讀計劃中,直到 @pod4g 同學(xué)回復(fù)了我的 issue(詳見 https://github.com/hanzichi/underscore-analysis/issues/2#issuecomment-2273...
摘要:梁文道暗戀到偷窺本文為讀源碼的第五篇,后續(xù)文章會更新到這個倉庫中,歡迎也會同步倉庫的更新,地址本篇分析的是函數(shù)。源碼分析來看下的源碼其實的源碼其實就只有這么一句。但是返回的是規(guī)定和都為時返回的是。 暗戀之純粹,在于不求結(jié)果,完全把自己鎖閉在一個單向的關(guān)系里面?!何牡馈栋祽俚酵蹈Q》 本文為讀 lodash 源碼的第五篇,后續(xù)文章會更新到這個倉庫中,歡迎 star:pocket-lo...
摘要:二進制和八進制提供了二進制和八進制數(shù)值的新的寫法,分別用前綴或和或表示。八進制聲明八進制的英文單詞是,也是以零開始的,然后第二個位置是歐,然后跟上八進制的值就可以了。用來檢查一個數(shù)值是否為有限的。對于非數(shù)值,內(nèi)部使用方法將其先轉(zhuǎn)為數(shù)值。 二進制和八進制 ES6 提供了二進制和八進制數(shù)值的新的寫法,分別用前綴0b(或0B)和0o(或0O)表示。 二進制聲明: 二進制的英文單詞是Binar...
摘要:常見基礎(chǔ)對象屬性方法二關(guān)于的箭頭函數(shù)的返回對象的問題箭頭函數(shù)具有隱式返回的特性。返回值函數(shù)累計處理的結(jié)果。語句將某個對象添加的作用域鏈的頂部,如果在中又某個未使用命名空間的變量,跟作用域鏈中的某個屬性同名,則這個變量將指向這個屬性值。 js常見基礎(chǔ)對象屬性方法 (二) 關(guān)于es6的箭頭函數(shù)的返回對象的問題 箭頭函數(shù)(=>)具有隱式返回的特性。如果某個函數(shù)體只有單個表達式,你就可以忽略r...
閱讀 1107·2021-11-23 09:51
閱讀 1074·2021-10-18 13:31
閱讀 2965·2021-09-22 16:06
閱讀 4256·2021-09-10 11:19
閱讀 2195·2019-08-29 17:04
閱讀 425·2019-08-29 10:55
閱讀 2472·2019-08-26 16:37
閱讀 3368·2019-08-26 13:29