通过对书籍的阅读,对数值转化这一方面有了更深的了解。
我们都知道,有三个函数可以把非数值转化为数值:Numder()、parseInt()、parseFloat()。
(1)Number()可以用于任何类型(2)另两个函数则专门用于把字符串转化为数值。这三个函数对于相同的输入存在着返回不同的结果。
首先,让我们来讨论Numder()函数的转换规则:
Boolean值 | true和false分别被转化为1和0 |
数字值 | 没有任何改变 |
null | 返回0 |
undefined | 返回NAN |
对象 | 调用对象的valueof()方法,按照规则转化返回的值。如果转化结果为NAN,则调用对象的toString()方法,然后按照前面的规则转换返回的字符串 |
而对于字符串我们又在这其中分为以下几个规则:
只包含数字(包括前面是正负号) | 转化为十进制数值。例如:"1"转化为1,"011"转化为11(前面的先导0被忽略了) |
包含有效的浮点格式 | 例如:“01.1”转化为1.1(同样会忽略前面的先导0) |
包含有效的十六进制格式 | 例如:“0x1”转化为1(将其转化为相同大小的十进制整数值) |
字符串为空 "" | 将其转化为0 |
包含除上述格式之外的字符 | 将其转化为NAN |
让我们举几个例子吧:
Number("demo") //NAN Number("") //0 Number("00001") //1(忽略先导0) Number(true) //1
事实上,一元操作符的操作与Number()函数相同
对于Number()函数,想必大家都是抱有疑问的吧。例如,若我们希望能够识别先导0来以此转化为八进制或者十六进制,该怎么做呢?
这是parseInt()函数就上场了,在处理整数的时候我们更常用的就是这个函数。
parseInt()函数在转换字符串的时候,更多的时候是看其是否符合数值模式。
(1)它会忽略字符串前面的空格,直到找到第一个非空格字符。
(2)如果第一个字符不是数字字符或负号,将会直接返回NAN。(parseInt()转化""会返回NAN,而Number()返回0)
(3)如果第一个字符是数字字符,它将会继续解析,直到解析完成或遇到了非数字字符。例如:"1234hello"会被转化为1234.
(4)parseInt()也能识别各种整数格式(解决了刚才的问题),例如如果以"0x"开头,将会将其当做十六进制进行解析。
下面给出一些例子:
parseInt("123ddd") //123 parseInt("") //NAN parseInt("0xA") //10 parseInt("22.5") //22
然而对于parseInt()解析像八进制字面量的字符串时,ECMAScript 3和5是存在分歧的。例如:parseInt("070");
在ECMAScript 3中认为是56(八进制),在ECMAScript 5中 认为是70(十进制,忽略了前面的0),因此在ECMAScript 5中已经不具有解析八进制的能力,为了解决这样的困惑,我们为这个函数提供了第二个参数:转换时使用的基数。
例如:parseInt("0xAF",16) //175 (事实上,因为已经指定了转换的基数,因此也不用写前面的"0X",parseInt("AF",16)所返回的值也是175。
需要注意的是,相同的字符串,面对不同的基数会有不同的输出结果。因此为了避免错误,我们建议无论在什么情况下都明确指定基数。
最后让我们来谈谈parseFloat()这个函数:
parseFloat()与parseInt()很类似,不同的是:
对于parseFloat():
(1)字符串的第一个小数点是有效的,而第二个小数点是无效的,因此它后面的字符串将会被忽略。
(2)它始终忽略前导的0,也就是它只能解析十进制,也没有第二个参数
需要注意的是:对于字符串是一个可解析为整数的数(无小数点或小数点后为零),均会返回整数。
下面给几个例子:
parseFloat("123dd") //123 parseFloat("0xA") //0 parseInt("22.5.1") //22.5 parseInt("21.000") //21
经过以上的回顾与复习,我来进行一下总结:
(1)对于Number()与parseInt()、parseFloat(),第一个区别是第一个函数可以用于任何数据类型,而后两个是专门针对字符串的
(2)
1.对于字符串内包含字母或其他(除""外),Number函数时直接返回NAN,而parseInt和parseFloat函数是看字符串内前面的第一个字符是否为数字字符,只要第一个是数字字符,就可返回相应的数字。
2.对于"",Number返回0,而其他两个函数时返回NAN。
(3)对于parseInt,我们可以根据第二个参数,即指定的基数,来决定输出什么值。
以上是我对数值转化部分的粗略总结,均来自对JAVAScript高级程序设计(第3版)的理解与总结