成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

關(guān)于NaN

jubincn / 3103人閱讀

摘要:它有兩個(gè)重要的性質(zhì)與任何值都不相等,包括自身任何涉及的操作都會返回。關(guān)于是對象的一個(gè)方法,比較詭異的是并不是判斷參數(shù)本身是不是,而是判斷是不是。返回的結(jié)果是一個(gè)布爾值。先用轉(zhuǎn)換參數(shù),再判斷轉(zhuǎn)換后的結(jié)果是不是不等于自身。

昨天看到一個(gè)面試題:怎樣實(shí)現(xiàn) isNaN() 方法?

細(xì)細(xì)研究了一下 NaN,發(fā)現(xiàn)這個(gè)東西不常用,坑卻異常多,頗有 “茴” 字有幾種寫法的感覺,這里記錄下總結(jié)的東西吧。

NaN 是什么

NaNNot a Number(非數(shù)值),但它是一個(gè)特殊的數(shù)值,所以:

typeof(NaN)  // "number"

編碼時(shí)很少直接使用 NaN,通常是在計(jì)算失敗時(shí),作為 Math 的某個(gè)方法的返回值出現(xiàn)的。

它有兩個(gè)重要的性質(zhì):

NaN與任何值都不相等,包括NaN自身:

alert(NaN == NaN)  // false
alert(NaN === NaN)  // false

任何涉及 NaN的操作都會返回NaN。

哪些情況會產(chǎn)生NaN? 1. 計(jì)算

JS 在進(jìn)行加減乘除運(yùn)算之前,會先調(diào)用 Number()方法,將非數(shù)值的運(yùn)算項(xiàng)轉(zhuǎn)化為數(shù)值,如果轉(zhuǎn)換失敗就返回NaN,比如:

1-"a";   // NaN

首先是執(zhí)行Number("a"),不能成功轉(zhuǎn)化為數(shù)值,返回NaN,再利用NaN的第二條性質(zhì):任何涉及 NaN的操作都會返回NaN,所以最終的結(jié)果是NaN。

2. 類型轉(zhuǎn)換

當(dāng)一個(gè)值不能被Number,parseInt,parseFloat成功轉(zhuǎn)換為數(shù)值,就返回NaN,舉例:

Number("123.456abc");   // NaN
parseInt("123.456abc");  // 123
parseFloat("123.456abc"); // 123.456

Number("abc");  // NaN
parseInt("abc");  // NaN
parseFloat("abc");  // NaN

Number([]);  // 0
parseInt([]);  // NaN
parseFloat([]);  // NaN

Number("");  // 0
parseInt("");  // NaN
parseFloat("");  // NaN

Number({});  // NaN
parseInt({});  // NaN
parseFloat({});  // NaN

這里要注意三者之間的差異,我的理解是 parseIntparseFloat會盡量將參數(shù)值轉(zhuǎn)化為數(shù)值。

關(guān)于isNaN()

isNaNwindow對象的一個(gè)方法,比較詭異的是:isNaN(x)并不是判斷參數(shù)x本身是不是NaN,而是判斷Number(x)是不是NaN。也就是說先用Number()去轉(zhuǎn)化參數(shù),再去判斷轉(zhuǎn)化的結(jié)果。返回的結(jié)果是一個(gè)布爾值。

isNaN(NaN);  // true
isNaN(123);  // false
isNaN("abc");  //true
isNaN("123abc"); //true

isNaN({});  // true,因?yàn)镹umber({})=NaN
isNaN("");  // false, 因?yàn)镹umber("")=0
isNaN([]);  // false,因?yàn)镹umber([])=0

可以看到最后, 空字符串"" 和 空數(shù)組[]顯然是非數(shù)值,而isNaN返回了false,原因就是Number轉(zhuǎn)換在作怪,這點(diǎn)還是很詭異的...所以我選擇慎用...

那么isNaN是怎么實(shí)現(xiàn)的呢,原理就是利用NaN的第一條性質(zhì):NaN與任何值都不相等,包括NaN自身。

var isNaNA = function(value) {
    var n = Number(value);
    return n !== n;
};

先用Number()轉(zhuǎn)換參數(shù),再判斷轉(zhuǎn)換后的結(jié)果是不是不等于自身。

而 MDN 上給的實(shí)現(xiàn)方式是這樣的:

var isNaNB = function(value) {
    var n = parseInt(value);
    return n !== n;
};

我覺得是有問題的,因?yàn)?

isNaN("123abc");    // true
isNaNA("123abc");   // true
isNaNB("123abc");   // false
Number.isNaN()

ES6 中的Number.isNaN()是一個(gè)判斷NaN的升級版,和isNaN()不同的是,Number.isNaN()不會強(qiáng)制轉(zhuǎn)化參數(shù),直接對參數(shù)本身做判斷,這樣只有參數(shù)顯示等于NaN,才會返回true

Number.isNaN(NaN);  // true,其他情況都返回 false

它的實(shí)現(xiàn)原理是:

function isNaNC (value) {
    return typeof(value) === "number" && isNaN(value);
}

算了,還是不糾結(jié)了....

參考

MDN isNaN()
JavaScript中的 NaN 與 isNaN

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108419.html

相關(guān)文章

  • 關(guān)于javascript中類型判斷的那些疑惑

    摘要:對于復(fù)雜類型它的每個(gè)實(shí)例都有屬性。當(dāng)檢測實(shí)例時(shí)優(yōu)于因?yàn)槟軝z測這段代碼是從的。補(bǔ)充以下結(jié)果,發(fā)現(xiàn)第三種方法也能正確判斷出。我們知道結(jié)果是那如何判斷兩個(gè)變量呢比較兩個(gè)變量,使用的即可。 Javascript中數(shù)據(jù)類型分為兩種: 簡單數(shù)據(jù)類型:Undefined, NULL, Boolean, Number, String 復(fù)雜數(shù)據(jù)類型:Object 接下來我們就來看看怎么做數(shù)據(jù)類型判別...

    李增田 評論0 收藏0
  • 【JS】關(guān)于JS的一些知識點(diǎn)(JS基礎(chǔ),純記錄)

    摘要:如何讓根據(jù)拆箱轉(zhuǎn)換,以及的隱式轉(zhuǎn)換,可以如下寫為什么計(jì)算機(jī)中所有的數(shù)據(jù)都是以二進(jìn)制存儲的,所以在計(jì)算機(jī)計(jì)算時(shí)要把數(shù)據(jù)先轉(zhuǎn)換成二進(jìn)制進(jìn)行計(jì)算,然后把計(jì)算結(jié)果轉(zhuǎn)換成十進(jìn)制。會存在精度丟失問題和的二進(jìn)制都是以無線循環(huán)的小數(shù)的二進(jìn)制的二進(jìn)制 本想著記筆記里,但是筆記里沒有分類,還是以文章的形式,當(dāng)個(gè)人總結(jié)吧,這一篇就當(dāng)作JS基礎(chǔ)篇的記錄吧,有修改的和新增的持續(xù)更新~ 關(guān)于JS的一些小技巧 1:...

    SwordFly 評論0 收藏0
  • 關(guān)于javascrip ==(等號) 和===(恒等)判斷

    摘要:與所有值都不相等,包括它自己判斷規(guī)則,兩邊值類型不同的時(shí)候,要先進(jìn)行類型轉(zhuǎn)換,再比較。判斷一個(gè)值是否是,只能用來判斷如果兩個(gè)都是字符串,每個(gè)位置的字符都一樣,那么相等否則不相等。等號如果兩個(gè)值類型相同,進(jìn)行比較。 說明 在JavaScript中,下面的值被當(dāng)做假(false),除了下面列出的值,都被當(dāng)做真(true): false null undefined 空字符串 數(shù)字 0 N...

    joywek 評論0 收藏0
  • Js中的Number

    摘要:如果參數(shù)不是數(shù)值都返回去掉非數(shù)字部分返回?cái)?shù)字部分遇到的第一個(gè)非數(shù)字停止相比可以多識別一個(gè)和是將全局方法和,移植到對象上面,行為完全保持不變。 關(guān)于Number的常用方法和注意點(diǎn) NaN NaN 是代表非數(shù)字的特殊屬性 NaN 注意點(diǎn) NaN不是一個(gè)數(shù) 但是屬于number類型 typeof NaN //number NaN和NaN不相等 NaN == NaN //false 何時(shí)會出現(xiàn)...

    LiuZh 評論0 收藏0
  • 透徹研究Javascript類型轉(zhuǎn)換

    摘要:注釋空數(shù)組空對象轉(zhuǎn)換為布爾型也是坑。系統(tǒng)會在自動類型轉(zhuǎn)換的時(shí)候調(diào)用他們,所以我們通常不需要手動調(diào)用他們。嚴(yán)格相等不存在類型轉(zhuǎn)換,對于類型不同的兩個(gè)值直接返回。 Javascript 中有5種基本類型(不包括 symbol),以及對象類型,他們在不同的運(yùn)算中會被系統(tǒng)轉(zhuǎn)化為不同是類型,當(dāng)然我們也可以手動轉(zhuǎn)化其類型。 Javascript 類型轉(zhuǎn)換中的坑極多,就連 Douglas Crock...

    dailybird 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<