isNaN用法:
我们先来看一组结果:
其中,true和false都可以被Number转换成数字1和0
null和空数组[]可以被Number转换为数字0
对象{}和undefined不可以被Number转换成数字,返回NaN
对于空字符串或者空格字符串或者数字字符串,可以被Number转换为数值
对于数组:
所以我们大概知道哪些值可以被Number转换为数字,哪些不可以,可以简单理解为:
对于可以被Number转换为数值的值x,那么isNaN(x)就是false
如果不可以被Number转换为数值的值y,那么isNaN(y)就是true
对于Date()这种特殊对象:
new Date()是可以被Number转化为数值的,所以isNaN(new Date()) === false
而new Date().toString()
返回的是格式化的字符串,不能被Number转化为数值,所以isNaN(new Date().toString()) === true
注意:
isNaN()和Number.isNaN()区别
当我们向isNaN传递一个参数,它的本意是通过Number()方法尝试将这参数转换成Number类型,如果成功返回false,如果失败返回true。
所以isNaN只是判断传入的参数是否能转换成数字,并不是严格的判断是否等于NaN
Number('测试') // 输出NaN
// 因为没有将“测试”成功转换成Number类型,所以下面代码输出true
console.log(isNaN('测试')) // true
Number.isNaN判断传入的参数是否严格的等于NaN(也就是 ===)。
那一般在什么情况下会用到Number.isNaN呢?
当两个变量进行运算时,我们可以使用Number.isNaN来判断它的值是否为NaN:
console.log(Number.isNaN(2/'测试')); // 输出true
Number.isNaN与isNaN最的区别是,Number.isNaN不存在类型转换的行为。
console.log(isNaN('测试')) //true
console.log(Number.isNaN('测试')) //false
上面代码中,都是传入字符串“测试”,但为什么结果不同?原因在于:
isNaN会通过Number方法,试图将字符串"测试"转换成Number类型,但转换失败了,因为 Number(‘测试’) 的结果为NaN ,所以最后返回true。
而Number.isNaN方法,只是严格的判断传入的参数是否全等于NaN( ‘测试’ === NaN) ,字符串当然不全等于NaN啦,所以输出false。