parseInt()
parseInt([value]): 把VALUE转换为数字,要求VALUE是字符串(不是字符串先默认转换为字符串),从字符串左边开始查找,找到有效数字字符转换为数字(遇到一个非有效的数字字符,则停止查找,所以小数点也属于非有效数字)
parseInt([value],[radix]):首先[VALUE]是这个字符串,他是把这个值看做[RADIX]这个进制,然后最后转换为10进制的数字
radix省略或者为0,则radix默认按照10进行处理(特殊:字符串[VALUE]以 0x/oX 开头,radix默认按照16进行处理,如果字符串[VALUE]不是以 0 开头,并且radix为 0,则radix默认按照10进行处理)
radix不在2~36之间,最后结果都为NaN
例1:
parseInt('2AF5', 16); //=>把'2AF5'当做16进制,最后转换为10进制
从个位开始数
5*16^0 + F*16^1 + A*16^2 + 2*16^3 =
5*1 + 15*16 + 10*16*16 + 2*16*16*16 = 10997
例2(知识点):
抛开parseInt,如果单算'72.45',把为8进制转换为10进制
先算整数部分,再算小数部分(小数进制转换时,取倒数的平方)
2*1 + 7*8 + 4*(1/8) + 5*(1/(8*8)) = 58.578125
例3:
parseInt('231', 3);
3进制只能是 0~2 所以查找到3的时候,发现已经不是3进制的范畴了,则不再继续查找
把2当做3进制,最后转换为十进制
2*3^0 = 2
parseInt('23461', 5);
'234' 看做 5进制,转换为10进制
4+3*5+2*5*5 = 69
相当于parseInt('12px',10)
parseInt第二个参数传10与不传,都是一样把'12px'当做10进制,所以当找到'p'的时候就不再查找了
例4:
let arr = [1, 2, 3, 4];
arr = arr.map(parseInt);
console.log(arr);
注:[1, 2, 3].map(parseInt) 等价于 [parseInt(1, 0), parseInt(2, 1), parseInt(3, 2)]
parseInt(1,0) =>1
parseInt(2,1) =>NaN
parseInt(3,2) =>NaN
parseInt(4,3) =>NaN
parseFloat()
与parseInt()函数类似,parseFloat()也是从第一个字符(位置0)开始解析每个字符。而且也是一直解析到末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,地富川中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符将被忽略
parseFloat('22.34.5')将被转换为22.34
由于parseFloat()只解析十进制值,所以没有第二个参数
Number()
前面两个parseInt()、parseFloat()都是专门用于把字符串转换为数字(不是字符串先默认转换为字符串)
而Number()可以用于任何数据类型
Number()函数的转换规则如下:
(1).如果是Boolean值,true和false将分别被转换为1和0。
(2).如果是数字值,只是简单的传入和返回。
(3).如果是null值,返回0。
(4).如果是undefined,返回NaN。
(5).如果是字符串,遵循下列规则:
如果字符串中只包含数字(包括前面带加号或负号的情况),则将其转换为十进制数值,即"1"会变成1,"123"会变成123,而"011"会变成11(注意:前导的零被忽略了);
如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
如果字符串是空的(不包含任何字符),则将其转换为0;
如果字符串中包含除上述格式之外的字符,则将其转换为NaN。
(6).如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符 串值。
根据这么多的规则使用Number()把各种数据类型转换为数值确实有点复杂。下面还是给出几个具体的例子吧。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1