JavaScript日常会跳的坑系列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。

以上是关于JavaScript日常会跳的坑系列的主要内容,如果未能解决你的问题,请参考以下文章

跳表 | 会跳的链表真的非常diao

MacOS Sierra10.12.4编译Android7.1.1源代码必须跳的坑

译文:18个实用的JavaScript代码片段,助你快速处理日常编程任务

window上面安装zookeeper跳的坑

MacOS Sierra10.12.4编译Android7.1.1源码必须跳的坑

使用 StringUtils.split 的坑