摘要:有一次項(xiàng)目中發(fā)現(xiàn)原來(lái)和是有著不一樣的判斷結(jié)果。要了解他們的區(qū)別,首先得明確到底是什么在的官方解釋中是一個(gè)全局代表的值。目前的結(jié)論的類(lèi)型是,這還是有點(diǎn)令人困惑。但從我們上述對(duì)的理解來(lái)看,這樣的判斷顯然不正確。
有一次項(xiàng)目中發(fā)現(xiàn)原來(lái)isNaN和Number.isNaN是有著不一樣的判斷結(jié)果。記錄一下避免下次踩坑。
要了解他們的區(qū)別,首先得明確NaN到底是什么?
在MDN的官方解釋中
The global NaN property is a value representing Not-A-Number.
NaN是一個(gè)全局代表“Not-A-Number”的值。這樣的解釋個(gè)人覺(jué)得還是有些模糊。
在You-Dont-Know-JS中給出了更詳細(xì)的解釋?zhuān)?/p>
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"等描述說(shuō)明NaN首先得是一個(gè)Number類(lèi)型的值,其次再判斷是不是“not a number”。
目前的結(jié)論:”not-a-number“的類(lèi)型是number,這還是有點(diǎn)令人困惑。我們來(lái)看下的You-Dont-Know-JS中的場(chǎng)景描述:(怕翻譯產(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."
再來(lái)看一個(gè)例子:
var a = 2 / "foo"; // NaN typeof a === "number"; // true
看到這里相信大家對(duì)NaN已經(jīng)有了較為完整的認(rèn)識(shí)。那么我們?nèi)绾蝸?lái)判斷計(jì)算產(chǎn)生的結(jié)果是NaN呢?
JS原生提供了isNaN的方法,拿上面的例子來(lái)舉例:
var a = 2 / "foo"; isNaN(a) // true;
看似沒(méi)什么問(wèn)題,但其實(shí)isNaN是有著致命的缺陷。它把對(duì)NaN的判斷就如同字面意思所寫(xiě)的那樣:test if the thing passed in is either not a number or is a number。但從我們上述對(duì)NaN的理解來(lái)看,這樣的判斷顯然不正確。
例如:
var a = 2 / "foo"; var b = "foo"; a; // NaN b; // "foo" window.isNaN( a ); // true window.isNaN( b ); // true
b顯然是一個(gè)字符串,從我們之前對(duì)NaN的定義(NaN的類(lèi)型是number)來(lái)看,b明顯不應(yīng)該是NaN。這個(gè)Bug由來(lái)許久,所以在es6中提供了替代方案Number.isNaN。我們來(lái)看下polyfill就知道他修復(fù)了什么問(wèn)題。
if (!Number.isNaN) { Number.isNaN = function(n) { return ( typeof n === "number" && window.isNaN(n) ); }; }
再試驗(yàn)下剛才的例子:
var a = 2 / "foo"; var b = "foo" Number.isNaN(a); // true Number.isNaN(b); // false
就能得出我們理想的結(jié)果了。
還有一種polyfill非常簡(jiǎn)單,利用了NaN不等于他自身的特性,NaN是唯一有此特性的值,其他值都等于它們自身(包括undefined和null):
if (!Number.isNaN) { Number.isNaN = function(n) { return n !== n; }; }
最后就是建議大家都使用Number.isNaN來(lái)進(jìn)行判斷,如果用了eslint的話,那只寫(xiě)isNaN是會(huì)報(bào)錯(cuò)的哦。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107904.html
摘要:但是跟普通的是的不一樣的是,代表這一意義。的沒(méi)有的情況下,可以采用以下簡(jiǎn)單來(lái)看,就是在原有的基礎(chǔ)上增加了一個(gè)的判斷,因?yàn)榈氖?。還有一種更加簡(jiǎn)單的實(shí)現(xiàn)利用了只有不跟自己相等的特性。不過(guò)我們可以通過(guò)以上方式來(lái)解釋判斷為什么會(huì)出現(xiàn)這樣的情況了。 例子 大家先看一看下面這個(gè)例子, isNaN(NaN); isNaN(A String); isNaN(undefined); isNaN({...
摘要:全局屬性表示的值,顧名思義,就是表示不是一個(gè)數(shù)字。值得注意的是,是引入的,可以用上面的。而能通過(guò)函數(shù)的只有。該認(rèn)為,應(yīng)該返回。 這篇文章并不在我的 underscore 源碼解讀計(jì)劃中,直到 @pod4g 同學(xué)回復(fù)了我的 issue(詳見(jiàn) https://github.com/hanzichi/underscore-analysis/issues/2#issuecomment-2273...
摘要:梁文道暗戀到偷窺本文為讀源碼的第五篇,后續(xù)文章會(huì)更新到這個(gè)倉(cāng)庫(kù)中,歡迎也會(huì)同步倉(cāng)庫(kù)的更新,地址本篇分析的是函數(shù)。源碼分析來(lái)看下的源碼其實(shí)的源碼其實(shí)就只有這么一句。但是返回的是規(guī)定和都為時(shí)返回的是。 暗戀之純粹,在于不求結(jié)果,完全把自己鎖閉在一個(gè)單向的關(guān)系里面。——梁文道《暗戀到偷窺》 本文為讀 lodash 源碼的第五篇,后續(xù)文章會(huì)更新到這個(gè)倉(cāng)庫(kù)中,歡迎 star:pocket-lo...
摘要:二進(jìn)制和八進(jìn)制提供了二進(jìn)制和八進(jìn)制數(shù)值的新的寫(xiě)法,分別用前綴或和或表示。八進(jìn)制聲明八進(jìn)制的英文單詞是,也是以零開(kāi)始的,然后第二個(gè)位置是歐,然后跟上八進(jìn)制的值就可以了。用來(lái)檢查一個(gè)數(shù)值是否為有限的。對(duì)于非數(shù)值,內(nèi)部使用方法將其先轉(zhuǎn)為數(shù)值。 二進(jìn)制和八進(jìn)制 ES6 提供了二進(jìn)制和八進(jìn)制數(shù)值的新的寫(xiě)法,分別用前綴0b(或0B)和0o(或0O)表示。 二進(jìn)制聲明: 二進(jìn)制的英文單詞是Binar...
摘要:常見(jiàn)基礎(chǔ)對(duì)象屬性方法二關(guān)于的箭頭函數(shù)的返回對(duì)象的問(wèn)題箭頭函數(shù)具有隱式返回的特性。返回值函數(shù)累計(jì)處理的結(jié)果。語(yǔ)句將某個(gè)對(duì)象添加的作用域鏈的頂部,如果在中又某個(gè)未使用命名空間的變量,跟作用域鏈中的某個(gè)屬性同名,則這個(gè)變量將指向這個(gè)屬性值。 js常見(jiàn)基礎(chǔ)對(duì)象屬性方法 (二) 關(guān)于es6的箭頭函數(shù)的返回對(duì)象的問(wèn)題 箭頭函數(shù)(=>)具有隱式返回的特性。如果某個(gè)函數(shù)體只有單個(gè)表達(dá)式,你就可以忽略r...
閱讀 1118·2021-11-23 09:51
閱讀 1082·2021-10-18 13:31
閱讀 2991·2021-09-22 16:06
閱讀 4284·2021-09-10 11:19
閱讀 2207·2019-08-29 17:04
閱讀 437·2019-08-29 10:55
閱讀 2485·2019-08-26 16:37
閱讀 3381·2019-08-26 13:29