Number数据类型是指正数、负数、零这一类的数据。但是在Number里面有一个特殊的数据,是NaN
,它表示的是Not a Number
,即,不是一个数字。
数字的声明可以如下:
var number = 10;
var number = 10.1;
var number = -10;
var number = 0;
而对于数据的比较,可以如下:
10 > 9;
10 == 10;
10 < 11;
其中,>, ==, <
分别代表,大于,等于,小于。在JavaScript中 ==
表示的是相等比较。
这里有一个注意点:
** NaN === NaN是不相等的,NaN和任何不相等 **
那如何比较NaN呢?如何判别一个数据是否是数字还是非数字呢?
可以使用JavaScript的一个函数:isNaN()
。
isNaN(): 检测一个值是否为有效数字,是有效数字,返回false。例如:
isNaN(10); // 返回false
isNaN("abc"); // 返回true
如果检测的类型不是number类型的,浏览器会默认的把它转化成number类型,然后在判断是否为有效数字。
console.log(isNaN('12'));
// -> false 会把'12'转化成number类型的 Number ==> Number("123")
这里的Number()
是指 强制将其他的数据类型转化为number类型,要求如果是字符串,字符串中一定都需要是有数字才能转换,如果有非数字的字符,则无法转换。例如:
console.log(Number('12.5px')); // NaN ->无法转换,有非数字字符px
console.log(Number('12.5')); // 12.5
console.log(Number("")); // 0 -> 空字符串转换结果为0
所以分析一下一行代码的情况:
console.log(isNaN("10")); // 返回false
首先,使用isNaN()判断时,它会先将非数字类型强制转换成数字类型,那么“10” --> Number("10")
,由于"10"里没有非数字的字符,所以Number("10") --> 10
。在对10进行isNaN()操作,显然10是一个数字,所以此时isNaN("10")
返回false。
既然Number()是强制转换成数字,那是否有非强制的转换成数字的方法呢?
答案是有的,分别是parseInt()
和parseFloat()
。
它们俩的工作原理是:从左到右,一个个字符查找,把是数字的转化为有效的数字,中途如果遇到了一个非有效的数字,就不再继续查找了。
而区别是parseFloat()
可以多识别一个小数点。
console.log(parseInt('12px')); // 12
console.log(parseInt('12px13')); // 12
console.log(parseInt('javascript2017')); // NaN
console.log(parseInt('12.5px')); // 12
console.log(parseFloat('12.5px')); // 12.5
一道面试题:
var val = Number('12px'); // 此时val为NaN
if (val === 12) {
console.log(12);
} else if (val === NaN) { // NaN和任何值不相等
console.log(NaN);
} else {
console.log('以上都不成立'); // 输出
}
解析:Number('12px'),由于Number()转换数字时,里面的数字只能全是数字字符,否则无法转换返回NaN,所以当传入"12px"时,返回NaN,此时val = NaN;这样第一个if条件不能通过。又因为NaN和任何值都不相等,包括NaN本身,所以 val === NaN不成立。所以输出以上都不成立。