彻底搞懂parseInt、parseFloat、Number

2,397 阅读4分钟

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