NaN
JavaScript中有一个特殊的对象:NaN
,它表示一个非法的数字(Not-a-Number)。这个对象十分特殊,它的类型是number
,属于原始值,但是和自身不相等。即NaN === NaN
返回false
。
NaN和自身不相等,乍一看违反直觉,但却符合IEEE754的规定。IEEE754的委员会成员曾经解释过将NaN设计为不等的权衡。
isNaN
由于NaN
的特殊性,我们经常需要判断一个值是否为NaN,通常我们使用isNaN
来判断,例如:
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN(true); // false
isNaN(null); // false
isNaN(1); // false
如果说NaN
是JavaScript的一个坑的话,isNaN
就是另一个坑了。因为isNaN
会先将传递给它的对象转化为数字类型。而我们知道,对于普通的字符串,转化为数字类型会返回NaN
。于是就踩坑了。。。
isNaN("1"); // fales "1" 被转化为数字 1,因此返回false
isNaN("SegmentFault"); // true "SegmentFault" 被转化成数字 NaN
所以说,通常对字符串使用isNaN
方法会返回true
,isNaN
坑爹了——当然,isNaN
也许会辩驳说这不是它的坑,这是JavaScript强制类型转换的坑。
那么,可不可以不做类型转换直接判断呢?ES6用Number.isNaN
填上了这个坑。Number.isNaN
不会转换对象的类型。
Number.isNaN('SegmentFault'); // false
ES6的这个新特性,已经被NodeJS和部分浏览器所支持。
Number()
Number() 函数把对象的值转换为数字。返回值
如果参数是 Date 对象,Number() 返回从 1970 年 1 月 1 日至今的毫秒数。
如果对象的值无法转换为数字,那么 Number() 函数返回 NaN。
实例
在本例中,我们将尝试把不同的对象转换为数字:
<script type="text/javascript"> var test1= new Boolean(true); var test2= new Boolean(false); var test3= new Date(); var test4= new String("999"); var test5= new String("999 888"); document.write(Number(test1)
+ "<br />"); document.write(Number(test2)
+ "<br />"); document.write(Number(test3)
+ "<br />"); document.write(Number(test4)
+ "<br />"); document.write(Number(test5)
+ "<br />"); </script>
输出:
1 0 1256657776588 999 NaN
parseInt()
parseInt() 函数可解析一个字符串,并返回一个整数。返回解析后的数字。
说明
当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。
提示和注释
注释:只有字符串中的第一个数字会被返回。
注释:开头和结尾的空格是允许的。
提示:如果字符串的第一个字符不能被转换为数字,那么 parseFloat() 会返回 NaN。
实例
在本例中,我们将使用 parseInt() 来解析不同的字符串:
parseInt("10"); //返回 10 parseInt("19",10); //返回 19 (10+9) parseInt("11",2); //返回 3 (2+1) parseInt("17",8); //返回 15 (8+7) parseInt("1f",16); //返回 31 (16+15) parseInt("010"); //未定:返回 10 或 8
parseFloat()
parseFloat() 函数可解析一个字符串,并返回一个浮点数。parseFloat 是全局函数,不属于任何对象。
parseFloat 将它的字符串参数解析成为浮点数并返回。如果在解析过程中遇到了正负号(+ 或 -)、数字 (0-9)、小数点,或者科学记数法中的指数(e 或 E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。同时参数字符串首位的空白符会被忽略。
如果参数字符串的第一个字符不能被解析成为数字,则 parseFloat 返回 NaN。
提示:您可以通过调用 isNaN 函数来判断 parseFloat 的返回结果是否是 NaN。如果让 NaN 作为了任意数学运算的操作数,则运算结果必定也是 NaN。
返回值
返回解析后的数字。
提示和注释
注释:开头和结尾的空格是允许的。
提示:如果字符串的第一个字符不能被转换为数字,那么 parseFloat() 会返回 NaN。
提示:如果只想解析数字的整数部分,请使用 parseInt() 方法。
实例
例子 1
在本例中,我们将使用 parseFloat() 来解析不同的字符串:
<script type="text/javascript"> document.write(parseFloat("10")) document.write(parseFloat("10.00")) document.write(parseFloat("10.33")) document.write(parseFloat("34 45 66")) document.write(parseFloat(" 60 ")) document.write(parseFloat("40 years")) document.write(parseFloat("He was 40")) </script>
输出:
10 10 10.33 34 60 40 NaN