判断是否是NaN的方法isNaN
全局作用域中,有个方法,叫isNaN,在判断数据的时候,会将数据做类型转换(可以判断字符串,布尔值等类型)
ES6为了纠正数据类型转换的问题,提供了Number.isNaN方法,只能判断数字中的NaN,不会做类型转换
判断数字是有限的方法isFinite
全局作用域中,提供了isFinite,可以判断是否是有限的,判断的不够准确(会对字符串,布尔值等做转换)
ES6为了纠正这个问题,提供过滤Number.isFinite方法,只能判断数字类型是否是有限的
总结区别: isNaN和isFinite方法都是window对象的方法,他们在判断数据的时候会对数据做类型转换,转换完再判断,所以判断有时候是不准确的。而Number.isNaN和Number.isFinite是es6新出的,对Number对象的拓展方法,它们进行判断的时候不会转化类型,所以判断更准确。
举例如下:
isNaN('abc') => true(判断时进行了类型转化,把‘abc’转化为了NaN) Number.isNaN('abc') => false(没有进行类型转换)
isFinite('123') => true(判断时进行了类型转化,把‘123’转化为了123) Number.isFinite('123') => false(没有进行类型转换)
下面提供测试代码,详细看区别:
// 定义几个数字
// 创建NaN
var num1 = +'abc';
// 创建正无穷 Infinity
var num2 = 1/0;
// 创建负无穷 -Infinity
var num3 = -1/0;
// 创建一个正零 0
var num4 = 0/1;
// 创建一个负零 -0
var num5 = -0/1;
// 如何判断一个数是否是NaN
console.log(isNaN(num1)) // NaN true
console.log(isNaN(20)) // 20 false
console.log(isNaN('abc')) // 'abc' true
console.log(isNaN('123')) // '123' false
// 测试Number.isNaN
console.log(Number.isNaN(num1)) // NaN true
console.log(Number.isNaN(num2)) // Infinity false
console.log(Number.isNaN('abc')) // 'abc' false
console.log(Number.isNaN('123')) // '123' false
// 如何判断一个数字是有限的
console.log(isFinite(num1)) // NaN false
console.log(isFinite(num3)) // -Infinity false
console.log(isFinite(-123.456)) // -123.456 true
console.log(isFinite('abc')) // 'abc' false
console.log(isFinite('123')) // '123' true
console.log(isFinite(true)) // true true
console.log(isFinite(undefined))// undefined false
// 测试Number.isFinite()
console.log(Number.isFinite(num1)) // NaN false
console.log(Number.isFinite(num3)) // -Infinity false
console.log(Number.isFinite(-123.456)) // -123.456 true
console.log(Number.isFinite('abc')) // 'abc' false
console.log(Number.isFinite('123')) // '123' false
console.log(Number.isFinite(true)) // true false
console.log(Number.isFinite(undefined)) // undefined false
面试中常考:
+'abc' => NaN
0/0 => NaN
1/0 => Infinity
-1/0 => -Infinity
0/1 => 0
-0/1 => -0
值为false的数据一共有6个:0, NaN,’’, false, undefined, null
这六个值转化成数字值是NaN有两个:NaN, undefined。剩下四个都是0