首页 > JS 中为什么 isNaN({}) 是 true 呢?

JS 中为什么 isNaN({}) 是 true 呢?

JS 中为什么 isNaN({}) 是 true 呢?


NaN的意思是not a number。{}显然不是数,所以返回true。类似的还有"hello", [1,2,3], function (){}, 这些都是NaN。

更新:
如果你想要检查一个量是不是NaN本身的话,在ECMAScript6中,有个新加的函数叫Number.isNaN(),这个函数会返回正确的结果


传入的是一个空对象,当然不是NaN


isNaN()直译过来就是 是(is)非数字(NaN)
传入的值为 非数字 自然true


因为先调用{}的 toString方法得到字符串"[object Object]",然后把这个字符串转为数值 得到NaN

假入我们把{}的toString方法修改一下:

var obj = {};
obj.toString = function(){
                   return 123; 
               };
isNaN(obj);  //这里的结果就是false了

纠正:我上面的答案上面没有提到valueOf,具体见楼中评论


强类型的语言的思维是,参数类型一定要一致,会先检验参数,类型不符合的情况下,就直接返回false或者抛异常,比如python。

弱类型语言的思维是,类型不符合就想办法转换成符合的类型,比如不是numberparseFloatparseFloat的参数不是stringtoString{}.toString()的结果是[object Object],然后这个字符串传入parseFloat的结果是NaN,所以再传入isNaN的结果就是true

显然,这块按照这种思维来理解是非常合理的。我说的“合理”并不是说isNaN({})true这个结果合理,而是说这个转换过程是合理的。除非js不采用弱类型,但在它采用弱类型这个前提下,过程本身没有错。


这是一个bug
补充:NaN虽然意思的确是not a number,但不是某些答案中所说的不是一个数就是NaN,NaN在js中是一个真实存在的值,是一个number类型的值,当对一个非number进行类型转换,转换成一个number,而js引擎转换失败(例如parseFloat('abc'))时,就会产生NaN,具体转换方式请参考Object.prototype.valueOf方法,而我之所以说这是一个bug,是因为isNaN方法没有对传入的参数进行类型判断,而是私自把参赛转换成为number,所有isNaN({})才会是true,es6中的Number.isNaN实质是return typeof num == 'number' && isNaN(num)。如何题主需要使用,可以自行polyfill

【热门文章】
【热门文章】