摘要:它有兩個重要的性質與任何值都不相等,包括自身任何涉及的操作都會返回。關于是對象的一個方法,比較詭異的是并不是判斷參數本身是不是,而是判斷是不是。返回的結果是一個布爾值。先用轉換參數,再判斷轉換后的結果是不是不等于自身。
昨天看到一個面試題:怎樣實現 isNaN() 方法?
細細研究了一下 NaN,發現這個東西不常用,坑卻異常多,頗有 “茴” 字有幾種寫法的感覺,這里記錄下總結的東西吧。
NaN 是什么NaN 即 Not a Number(非數值),但它是一個特殊的數值,所以:
typeof(NaN) // "number"
編碼時很少直接使用 NaN,通常是在計算失敗時,作為 Math 的某個方法的返回值出現的。
它有兩個重要的性質:
NaN與任何值都不相等,包括NaN自身:
alert(NaN == NaN) // false alert(NaN === NaN) // false
任何涉及 NaN的操作都會返回NaN。
哪些情況會產生NaN? 1. 計算JS 在進行加減乘除運算之前,會先調用 Number()方法,將非數值的運算項轉化為數值,如果轉換失敗就返回NaN,比如:
1-"a"; // NaN
首先是執行Number("a"),不能成功轉化為數值,返回NaN,再利用NaN的第二條性質:任何涉及 NaN的操作都會返回NaN,所以最終的結果是NaN。
2. 類型轉換當一個值不能被Number,parseInt,parseFloat成功轉換為數值,就返回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
這里要注意三者之間的差異,我的理解是 parseInt,parseFloat會盡量將參數值轉化為數值。
關于isNaN()isNaN是window對象的一個方法,比較詭異的是:isNaN(x)并不是判斷參數x本身是不是NaN,而是判斷Number(x)是不是NaN。也就是說先用Number()去轉化參數,再去判斷轉化的結果。返回的結果是一個布爾值。
isNaN(NaN); // true isNaN(123); // false isNaN("abc"); //true isNaN("123abc"); //true isNaN({}); // true,因為Number({})=NaN isNaN(""); // false, 因為Number("")=0 isNaN([]); // false,因為Number([])=0
可以看到最后, 空字符串"" 和 空數組[]顯然是非數值,而isNaN返回了false,原因就是Number轉換在作怪,這點還是很詭異的...所以我選擇慎用...
那么isNaN是怎么實現的呢,原理就是利用NaN的第一條性質:NaN與任何值都不相等,包括NaN自身。
var isNaNA = function(value) { var n = Number(value); return n !== n; };
先用Number()轉換參數,再判斷轉換后的結果是不是不等于自身。
而 MDN 上給的實現方式是這樣的:
var isNaNB = function(value) { var n = parseInt(value); return n !== n; };
我覺得是有問題的,因為:
isNaN("123abc"); // true isNaNA("123abc"); // true isNaNB("123abc"); // falseNumber.isNaN()
ES6 中的Number.isNaN()是一個判斷NaN的升級版,和isNaN()不同的是,Number.isNaN()不會強制轉化參數,直接對參數本身做判斷,這樣只有參數顯示等于NaN,才會返回true
Number.isNaN(NaN); // true,其他情況都返回 false
它的實現原理是:
function isNaNC (value) { return typeof(value) === "number" && isNaN(value); }
算了,還是不糾結了....
參考MDN isNaN()
JavaScript中的 NaN 與 isNaN
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108419.html
摘要:對于復雜類型它的每個實例都有屬性。當檢測實例時優于因為能檢測這段代碼是從的。補充以下結果,發現第三種方法也能正確判斷出。我們知道結果是那如何判斷兩個變量呢比較兩個變量,使用的即可。 Javascript中數據類型分為兩種: 簡單數據類型:Undefined, NULL, Boolean, Number, String 復雜數據類型:Object 接下來我們就來看看怎么做數據類型判別...
摘要:如何讓根據拆箱轉換,以及的隱式轉換,可以如下寫為什么計算機中所有的數據都是以二進制存儲的,所以在計算機計算時要把數據先轉換成二進制進行計算,然后把計算結果轉換成十進制。會存在精度丟失問題和的二進制都是以無線循環的小數的二進制的二進制 本想著記筆記里,但是筆記里沒有分類,還是以文章的形式,當個人總結吧,這一篇就當作JS基礎篇的記錄吧,有修改的和新增的持續更新~ 關于JS的一些小技巧 1:...
摘要:與所有值都不相等,包括它自己判斷規則,兩邊值類型不同的時候,要先進行類型轉換,再比較。判斷一個值是否是,只能用來判斷如果兩個都是字符串,每個位置的字符都一樣,那么相等否則不相等。等號如果兩個值類型相同,進行比較。 說明 在JavaScript中,下面的值被當做假(false),除了下面列出的值,都被當做真(true): false null undefined 空字符串 數字 0 N...
摘要:如果參數不是數值都返回去掉非數字部分返回數字部分遇到的第一個非數字停止相比可以多識別一個和是將全局方法和,移植到對象上面,行為完全保持不變。 關于Number的常用方法和注意點 NaN NaN 是代表非數字的特殊屬性 NaN 注意點 NaN不是一個數 但是屬于number類型 typeof NaN //number NaN和NaN不相等 NaN == NaN //false 何時會出現...
摘要:注釋空數組空對象轉換為布爾型也是坑。系統會在自動類型轉換的時候調用他們,所以我們通常不需要手動調用他們。嚴格相等不存在類型轉換,對于類型不同的兩個值直接返回。 Javascript 中有5種基本類型(不包括 symbol),以及對象類型,他們在不同的運算中會被系統轉化為不同是類型,當然我們也可以手動轉化其類型。 Javascript 類型轉換中的坑極多,就連 Douglas Crock...
閱讀 3558·2021-11-22 15:11
閱讀 4634·2021-11-18 13:15
閱讀 2702·2019-08-29 14:08
閱讀 3576·2019-08-26 13:49
閱讀 3091·2019-08-26 12:17
閱讀 3287·2019-08-26 11:54
閱讀 3111·2019-08-26 10:58
閱讀 2030·2019-08-26 10:21