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。
待续…