一个弱爆了的问题。。JS里判断是否为数字isNaN函数的使用

我用isNaN来判断参数是否是数字,可是怎么会把对象也算进数字来呢?

clipboard.png

clipboard.png

数组按说只包含数字就对了啊,里面还有个对象。好奇怪。 null我还能理解,__ob__:Ti 又是什么鬼?


暂时先这样写好了,能解决问题。

clipboard.png

clipboard.png

为何浏览器console里显示数组里有个__ob__:Ti ?

阅读 7.1k
5 个回答

Number(null)为0,所有isNaN(null)等于false。
_ob_应该是你用了什么库,给Array.prototype加了方法。

用isNaN来判断参数是否是数字

这句是有问题的,为什么呢?因为你的参数都是字符串,只是是一种可以转成数字的字符串。在数组中放入的成员值有引号就知道了。

如果是真的数字类型,就在ID宣告时就要先强转型为数字类型才是好一些的作法,用一元正号(+)即可:

var ID = +(eleGenres[i].getAttribute('data-value'));

会用上isNaN的目的主要是要判断出NaN,因为NaN无法用严格相等比较(===)判断出来。

isNaN会先对参数作数字强转换,你不自己先转,它也会帮你转,不过判断出的结果有可能不是你要的。

isNaN(NaN);       // true
isNaN(undefined); // true
isNaN({});        // true

isNaN(true);      // false
isNaN(null);      // false
isNaN(37);        // false
isNaN('37');       // false

参数为字符串的结果有时候不一定是你要的,例如:

isNaN("123ABC"); // true
isNaN("");      //false
isNaN("blabla");   // true

ES6中的Number.isNaN函数会比较精准,但浏览器支持很还少。用下面的代码可以填充出Number.isNaN:

Number.isNaN = Number.isNaN || function(value) {
    return typeof value === "number" && isNaN(value);
}

实际上用typeof可以直接判断出数字类型,但如果不要NaN数字与0,写法是像下面这样:

var ID = +(eleGenres[i].getAttribute('data-value'));

if(typeof ID === "number" && !isNaN(ID) && ID){
    //...ID是你要的
}else{
    //...ID不是你要的
}

这里估计是遇到js类型转换的坑了,你考虑过这种情况没有?if(data-value=="")ID=new String("");换句话说,楼主你能保证你var的ID都能为数字的字符串?

因为Number(null)会返回0,isNaN()内部会先调用Number(value)转换下值,然后再比较,所以
isNaN(null),即isNaN(0),会返回false,可以用
if(!isNaN(ID) && typeof ID != 'object'){..}或者if(!isNaN(ID) && typeof ID == 'string'){..}
作为判断.

新手上路,请多包涵

很简单 你把id 全部输出一下 对应一下 就能知道哪个id输出的是哪个 再逐一解决

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题