javascript高级程序设计之数值转换

来源:互联网 发布:免费手机pdf编辑软件 编辑:程序博客网 时间:2024/06/01 07:20

数值转换

有3个函数可以把非数值转换为数值:Number(),parseInt()和parseFloat().第一个函数,即转型函数Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值.这3个函数对于同样的输入会有返回不同的结果.

Number()函数的转换规则如下.

1,如果是Boolean值,true和false将分别被转换为1和0;

2,如果是数字值,只是简单的传入和返回;

3,如果是null值,返回0;

4,如果是undefined,返回NaN;

5,如果字符串,遵循下列规则:

1,如果字符串中只包含数字,则将其转换为十进制数值,即"1"变成1,"011"变成11;

2,如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);

3,如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制数值;

4,如果"",转换为0

5,其它为NaN

6,如果是对象,则调用对象的valueof()方法,然后依照前面的规则转换返回的值.如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值.

由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用 的是parseInt()函数.parseInt()函数在转换字符串时,更多的是看其是否符合数值模式.它会忽略字符串前面的空格,直至找到第一个非空格字符.如果第一个字符不是数字字符或负号,parseInt()就会返回NaN,也就是说,用parseInt()转换空字符串会返回NaN.如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到非数字字符.如果"1234blue"会被转换为1234,"22.22"会被转换为22.

如果字符串中第一个字符是数字字符,parseInt()也能够识别出各种整数格式(八进制,十六进制),如果字符串以"0x"开头且后跟数字字符,就会将其当作一个十六进制整数,如果字符串以"0"开头且后跟数字字符,则会将其当作一个八进制数来解析

parseInt("0xA");//10(十六进制)

parseInt("070");//56(八进制)

为了消除在使用parseInt()函数时可能导致上述的困惑,ECMAScript也为这个函数提供了第二个参数:转换时使用的基数(即多少进制)

parseInt("0xAF",16);//175

parseInt("AF",16);//175

parseInt("AF");//NaN

建议无论在什么情况下都明确指定基数-特别是在像下面这样处理八进制值的情况下:

parseInt("010");

parseInt("010",8);//8

parseInt("010",10);//10(十进制解析)

注意:ECMAScript允许实现把以"0"开头的字符串解析为八进制或十进制数,转换这种字符串时,应该为parseInt指定第二个参数(0x或0X开头的无法解析为十进制或十六进制)

多数情况下,我们要解析的都是十进制数值,因此始终将10作为第二个参数是非常有必要的

与parseInt类似,parseFloat()也是从第一个字符开始解析每一个字符.也是一直解析到字符串末尾或者解析到遇见一个无效浮点数字为止,字符串中的第一个小数点是有效的,而第二个小数点是无效的了

除了第一个小数点有效之前,parseFloat()与parseInt()的第二个区别在于它始终都会忽略前导的零.parseFloat()可以识别前面讨论过的所有浮点数值格式,也包括十进制整数格式.但十六进制格式的字符串则始终会被转换成0.由于parseFloat()只解析十进制值,因此它没有用第二个参数指定基数的用法.最后还要注意一点:如果字符串包含的是一个可解析为整数的数(没有小数点,或小数点后都是0),parseFloat()会返回整数.

0 0
原创粉丝点击