数值类型转换Number()、parseInt()、parseFloat()

在开发中踩了一个坑,在进行两个字符串类型的值比较时,忘记转换成数值类型导致错误。所以借此正好整理下数值类型转换的几种方式的比较与区分。

Number()、parseInt()、parseFloat()的比较区分

  • Number()

   1. 如果传入的是数值类型,就是简单的传入和返回。

   2. 如果传入的是Boolean类型,true和false值将分别被转换为1和0。

   3. 如果传入的是null,返回的是0。

   4. 如果传入的是undefined,返回的是NaN。

   5. 如果传入的是字符串类型: 

       a. 字符串是整数型数字时,将其转换为十进制数值,忽略前导0。

       b. 字符串是有效浮点格式数字时,如"1.1",将其转换为对应的浮点数字,忽略前导0。

       c. 字符串是有效的十六进制格式数字时,如"0xf",将其转换为相同大小的十进制数值。

       d. 字符串为空,将其转换为0。

       e. 字符串中包含除上述格式之外的字符,则将其转换为NaN。

       注意a和b情况中,不论是不是以数字开头,如果字符串中除了数字还有别的字符,不会转换为数值,而是转换为NaN。

       而在c情况中,只要不是以正确的十六进制数,就转换为NaN。  

       即都符合第e条。

console.log(Number("012"))      //12 (忽略前导0)
console.log(Number("012.3"))    //12.3 (忽略前导0)

console.log(Number("1a"))       //NaN
console.log(Number("a1"))       //NaN

console.log(Number("1.1a"))     //NaN
console.log(Number("a1.1"))     //NaN

console.log(Number("0xfa"))     //250
console.log(Number("0xf~"))     //NaN
console.log(Number("a0xf"))     //NaN

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

  • parseInt()

       处理整数时,更常用parseInt()方法。

       如果传入的是字符串,parseInt()会忽略字符串前面的空格,直到找到第一个非空格字符;

       如果第一个非空字符不是数字或者负号,parseInt()就会返回NaN;所以转换转换空字符串时也是返回NaN;

       如果第一个非空字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符串或者遇到一个非数字字符。

 

       parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其它任何进制的字符串转换成整数,基是由parseInt()方法的第二个参数指定(默认为十进制)。

       所以要解析进制格式的数值时,可以使用parseInt()方法

console.log(parseInt("  34"))      //34 (默认为十进制,忽略字符串前的空格)

console.log(parseInt("ab"))        //NaN (第一个非空字符不是数字或负号)

console.log(parseFloat("34ab"))    //34 (解析到非数字字符为止)

console.log(parseInt("ab",16))     //171 (按照十六进制解析,“AF”为有效的数值)

console.log(parseInt("10",2))      //2 (按照二进制解析)
  • parseFloat()

       与parseInt()函数类似,parseFloat()也是会忽略字符串前面的空格,直到找到第一个非空字符,一直解析完所有字符或者遇到一个无效的浮点数字字符为止。

       也就是说,字符串中第一个小数点是有效的,而第二个小数点就是无效的,它后面的字符串将被忽略;

       parseFloat()只解析十进制,因此没有第二个参数来指定基数;

       如果字符串中包含的是一个可解析为正数的数(没有小数点或者小数点后面都是0),parseFloat()会返回整数。

console.log(parseFloat("  34"))      //34 (只解析十进制,忽略字符串前的空格)

console.log(parseFloat("AF"))        //NaN (第一个非空字符不是数字或负号)

console.log(parseFloat("34ab"))      //34 (解析到无效的浮点数字为止)

console.log(parseFloat("0xf"))       //0

console.log(parseFloat("12.5"))      //12.5

console.log(parseFloat("022.5"))     //22.5

console.log(parseFloat("16.3.35"))   //16.3

 

Number()、parseInt()和parseFloat()的区别:

1. parseFloat()解析的字符串中第一个小数点是有效的,而parseInt()遇到小数点会停止解析。因为小数点并不是有效的数字字符。

2. parseFloat()始终会忽略前导的0,十六进制格式的字符串始终会被转换成0,而parseInt()的第二个参数可以设置基数,按照这个基数的进制来转换。

3. Number()不同于parseInt()和parseFloat()的重要一点是:Number()只要有非数字字符都会返回NaN,不论是否以数字开头;而parseInt()和parseFloat()会取前面的数字。Number()哪怕是以数字开头,只要后面有非数字字符都会转换为NaN。

 

Number()、parseInt()和parseFloat()的相同点:都会忽略前导0。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值