天天看點

JavaScript中的各種小坑彙總

1、Number()将部分非數字類型轉換為0

強制轉換為數值類型函數:

parseFloat、parseInt

優點:對非數值類型統一傳回NaN

缺點:會将一部分符合數值類型的字元串也識别為數值

parseFloat("1")//1      
parseFloat("1s")//1,不是想要的
parseFloat(null)//NaN
parseFloat(undefined)//NaN
parseFloat("")//NaN      

Number

優點:對于字元串必須全部符合數值類型才會轉換成功

缺點:會将部分非數值類型轉換為0

Number("1")//1
Number("1s")//NaN
Number(null)//0,不是想要的
Number(undebug)//NaN
Number("")//0,不是想要的      

其中Number(null)和Number(“”)都會傳回0,而不是NaN,進而導緻了各種bug。

判斷是否是數值類型的解決方案

使用jquery提供的$.isNumeric函數判斷。

$.isNumeric("1")//true
$.isNumeric("1s")//false
$.isNumeric(null)//false
$.isNumeric(undefined)//false
$.isNumeric("")//false      

全部正确,附jquery的$.isNumeric函數源碼:

isNumeric: function( obj ) {
    // parseFloat NaNs numeric-cast false positives (null|true|false|"")
    // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
    // subtraction forces infinities to NaN
    // adding 1 corrects loss of precision from parseFloat (#15100)
    return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
},      

2、"".split(",")函數會傳回長度為1的數組

在說這個問題提之前需要先說下split函數的幾種特殊值的情況。

字元串的split函數的特殊值情況

1、參數不傳,傳回包含原字元串對象,長度為1的數組。

"".split()//[""]
"xxcanghai".split()//["xxcanghai"]      

2、參數傳空字元串,傳回将原字元串每個字元分隔的數組

若原字元串為空字元串則傳回空數組

"".split("")//[]
"xxcanghai".split("")//["x", "x", "c", "a", "n", "g", "h", "a", "i"]      

3、原字元串為空字元串,參數不為空時,會傳回包含一個空字元串的數組

"".split(",")//[""],錯誤,應為[]
"".split("xxcanghai")//[""],錯誤,應為[]      

可見,原字元串長度為0,且分隔符長度大于0時,會傳回一個包含空字元串的數組。

因為這個問題,導緻了各種各樣的bug。

待續…

如果您認為本文對得起您所閱讀他所花的時間,歡迎點選右下角↘ 推薦。您的支援是我繼續寫作最大的動力,謝謝

作者:小小滄海

出處:http://www.cnblogs.com/xxcanghai/

本文位址:http://www.cnblogs.com/xxcanghai/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。