美文网首页
JS 在数组中严格的判断NaN,并取出下标

JS 在数组中严格的判断NaN,并取出下标

作者: zackup | 来源:发表于2017-05-21 09:48 被阅读0次

    1.问题

    blob.png

    当然了,这里的注释部分可以不看,因为我发现有错误=。=

    问题来了,false 、null 、 0 、 "" 、undefined 都很好判断,直接使用===即可,但是 NaN 是不能用===来判断的,因为:

    NaN === NaN;
    false //永远返回 false , NaN 不等于其他任何值,包括它本身。

    如果不能使用 === 来检测NaN,那该使用什么呢?

    2.isNaN函数(不够严谨)

    为什么说isNaN不够严谨,拿图片中的例子打比方

    var a = [];
    for(var i=0;i<arr.length;i++){
      a.push(arr[i])
    }
    console.log(a);
    

    这个时候数组 a 是:

    "100px,NaN,,-98765,34,-2,0,300,,function () {alert(1);},,[object HTMLDocument],,true,NaN,23.45元,5,NaN,function () {alert(3);}"
    

    可以看到,为 NaN 的值有三个,这时,我们试试用 isNaN() 来判断下:

    var b = [];
    if( isNaN(arr[i]) ){
      b.push(i);
    }
    

    这个时候数组 b 是:

    "0,1,8,9,11,14,15,17,18"
    

    这跟我们之前看到的只有3个 NaN 差距也太大了吧~
    因为 isNaN() 存在问题,

    它总会隐式的将参数中的值转换成数字再做判断,这样就在判断很多明显不是 NaN 的值的时候也返回了 true ,任意的字符串使用 isNaN 都会返回 true ,这样就无法判断真正的 isNaN 了。

    3.解决方法

    • 在使用 isNaN() 之前先检查一下这个值是不是数字类型,这样就避免了隐式转换的问题:
    var c = [];
    if(typeof arr[i] === "number" && isNaN(arr[i])){
        c.push(i);
    }
    

    这个时候数组c是:

    "1,14,17"
    

    这样就没有问题了。

    相关文章

      网友评论

          本文标题: JS 在数组中严格的判断NaN,并取出下标

          本文链接:https://www.haomeiwen.com/subject/ekymxxtx.html