一、NaN:

1.定义:NaN 是 JavaScript 的一个特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。

2.NaN 不是一种独立的数据类型,而是一种特殊数值,它的数据类型依然属于 number ,使用 typeof 运算符可以看得很清楚。

typeof NaN // 'number'

3.NaN不等于任何值,包括它本身。

NaN === NaN // false

4.isNaN():可以用来判断一个值是否为 NaN 。

注意: 如果传入的非数值(如字符串),会先进行类型转换, 转成 NaN, 所以这个方法并不可靠!用 isNaN() 之前需要判断一下数据类型是否为 number 。

function isRealNaN(x){
    return typeof x === "number" && isNaN(x);
}

或者利用 只有 NaN 是JavaScript之中唯一不等于自身的值这个特点,进行判断。

function isTrueNaN(x){
    return x !== x;
}

二、Infinity 与 isFinite()

1.Infinity:表示“无穷”,是一个特殊的数值,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到 Infinity

2.isFinite():返回一个布尔值,检查某个值是不是正常数值

如果对 NaN 使用 isFinite 函数,也返回 false,表示 NaN 不是一个正常值。

isFinite(Infinity) // false
isFinite(NaN) // false
isFinite("abc") // false
isFinite(undefined) //false
isFinite({}) //false

注意参数为 true, false, null, [], "" 时返回 true

isFinite(true) // true
isFinite(false)// true
isFinite(null) //true
isFinite([]) //true
isFinite("") //true
isFinite(-1) // true

三、 parseInt() 和parseFloat()

1.parseInt() 用于将字符串转为整数; parseFloat()用于将字符串转为浮点数

parseInt('123') // 123
parseFloat('3.14') // 3.14

2.字符串转为整数或浮点数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。

parseInt('15px') // 15
parseFloat('3.14abcd ') // 3.14

3.如果字符串前后有空格,空格会被自动去除。

parseInt('   81') // 81
parseFloat('\t\v\r12.34\n ') // 12.34

4.如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN

parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN
parseInt('+') // NaN
parseInt('+1') // 1

5.对于那些会自动转为科学计数法的数字,parseInt()会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。如果字符串符合科学计数法,parseFloat())则会进行相应的转换。

parseInt(1000000000000000000000.5) // 1
// 等同于
parseInt('1e+21') // 1

parseFloat('314e-2') // 3.14
parseFloat('0.0314E+2') // 3.14

6.parseInt()还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt的第二个参数为10,即默认是十进制转十进制。

parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000
parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512

7.如果字符串包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。如果最高位无法转换,则直接返回NaN

parseInt('1546', 2) // 1
parseInt('546', 2) // NaN

8.如果parseInt()的第一个参数不是字符串,会被先转为字符串。这会导致一些令人意外的结果。

parseInt(0x11, 36) // 43
// 等同于
parseInt('17', 36)
parseInt(String(0x11), 36)

9.如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则parseFloat()返回NaN

parseFloat([]) // NaN
parseFloat('FF2') // NaN
parseFloat('') // NaN

四、强制类型转换的函数:Number()

1.Number(): 可以将任意类型的值转化成数值。

2.Number()将字符串转为数值,要比parseInt()严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN

parseFloat('123.45#') // 123.45
Number('123.45#') // NaN

2.如果Number()的参数是null, false, '', [] 则结果为0;如果为 true,则结果为 1parseInt()/parseFloat()的参数如果是这些特殊值时,一律为 NaN

Number(null)  //0
Number("")   //0
Number(false)   //0
Number([])   //0
Number(true) // 1

parseInt(null) // NaN
parseFloat(null) // NaN
parseInt("") // NaN
parseFloat("") // NaN
parseInt(false) // NaN
parseFloat(false) // NaN
parseInt([]) // NaN
parseFloat([]) // NaN
parseInt(true)  // NaN
parseFloat(true)  // NaN

3.Number()parseInt()parseFloat()一样,会自动过滤字符串前后的空格

Number('\t\v\r12.34\n') // 12.34

4.如果参数是对象时,将返回NaN,除非是包含单个数值的数组

Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5