javascript有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。
=================================================================
Number()可以用于任何数据类型(此函数平时很少使用)。
parseInt()、parseFloat()专门用于把字符串转换成数值(比较常用的哦)。
=================================================================
虽然Number()不常用,但是我们还是要说下它的转换规则:
【1】如果是Boolean值,true和false将分别被转换为1和0。
【2】如果是数字值,只是简单的传入和返回。
【3】如果是null值,返回0。
【4】如果是undefined,返回NaN。
【5】如果是字符串,遵循下列规则:
1)、如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转化为十进制数值,既"1"变成1,"123"变成123,但是"012"会变成11(注意:前导的零被忽略了);
2)、如果字符串中包含有效的浮点格式,如"1.1",将其转换为对应的浮点数值(同样也会忽略前导零);
3)、如果字符串中包含有效的十六进制格式,如"0xf"则将其转换为相同大小的十进制整数值;
4)、如果字符串是空的(不包含任何字符),则将其转换为0;
5)、如果字符串中包含除上述格式之外的字符,则将其转换为NaN;
【6】如果是对象,则调用对象的valueOf方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
说了这么多,大家看下例子吧:
var num1 = Number("Hello world"); //NaN var num2 = Number(""); //0 var num3 = Number("000011"); //11 var num4 = Number(true); //1
由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理函数的时候更常用parseInt()函数。
===================================================================================
【1】parseInt():从字符串中提取整数,遇到非数字,就停止,不在看后面的。
【2】parseInt()函数能够识别出各种整数格式(2、8、10、16进制度),默认是10进制。
如果要转换其他进制,要带上第二个参数:转换时使用的基数(即多少进制),默认10进制可以不带第二个参数。
【3】parseInt()函数在下面情况会提示NaN:
1)、第一个字符不是数字字符或者负号;
2)、转换空字符串
下面来看点示例:
var num1 = parseInt("22.5"); //22 var num2 = parseInt("1234blue"); //1234 var num3 = parseInt("blue1234"); //NaN var num4 = parseInt(""); //NaN var num5 = parseInt("AF", 16); //175(指定了16作为第二参数,字符串可以不带前面的"0x") var num6 = parseInt("10", 2); //2(按二进制解析) var num7 = parseInt("10", 8); //8(按八进制解析) var num8 = parseInt("10", 10); //10(按十进制解析) var num9 = parseInt("10", 16); //16(按十六进制解析)
由于parseInt()函数可以解析很多进制,为了避免错误解析,我们建议无论在什么情况下都要指定基数。
===============================================================================
【1】parseFloat():提取第一个浮点数,即小数。也可以理解为,字符串中的第一个小数点有效,第二个小数点无效,因此它后面的字符串将被忽略。
举个例子:"22.34.5"会被转换为22.34。
【2】parseFloat()转换规则:
1)、只解析十进制值,没有第二参数指定基数的用法。
2)、与parseInt()有区别,parseFloat()会始终忽略前导的零。
3)、可以十八前面讨论的所有浮点数值格式,也包括十进制整数格式,但十六进制格式的字符串则始终会被转换成0。
4)、如果字符串包含的是一个可解析为整数的数(没有小数点,或是小数点后面都是零),则返回整数。
下面看下示例:
var num1 = parseFloat("22.5"); //22.5 var num2 = parseFloat("22.34.5.6"); //22.34 var num3 = parseFloat("1234blue"); //1234 var num4 = parseFloat("0xA"); //0(十六进制) var num5 = parseFloat("0908.5"); //908.5(忽略前导零) var num6 = parseFloat("3.125e7"); //31250000(没有小数点,或者小数点后面都是零)
==============================================================================
【1】上面提到了NaN,那什么的NaN?
答:不是数值(非数值),字面全拼为:Not a Number
【2】NaN的作用是什么???
答:用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。
【3】NaN的特性是什么???
答:1)、任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。
2)、NaN与任何值都不相等,包括NaN本身
3)、在ECMAScript中,任何数值除以0都会返回NaN,因此不会影响其他代码的执行。(这里有一点要指出,任何数值除以0都会返回NaN,这是原书的说法,但实际上只有0除以0才回返回NaN,正数除以0返回Infinity,负数除以0返回-Infinity)
下面看一个例子:
alert(NaN == NaN); //false
【4】什么是isNaN()函数???
答:这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值(NaN)”。
【4】isNaN()函数的特点是什么???
答:1)、在接收到一个值后,会尝试将这个值转换为数值。
2)、某些不是数值的值会直接转换为数值,例如字符串"10"或是Boolean值
3)、任何不能被转换为数值的值都会导致这个函数返回true。
4)、也适用于对象,在使用时会首先调用对象的valueOf()方法,然后在确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值在调用toString()方法,再测试返回值。
下面看下示例:
alert(isNaN(NaN)); //true alert(isNaN(10)); //false(10是一个数值) alert(isNaN("10")); //false(可以被转换成数值10) alert(isNaN("blue")); //true(不能转换成数值) alert(isNaN(true)); //false(可以被转换成数值1)