JS Tips - Number(x) vs parseInt(x)

Number(x)

Number从命名可以看出来它是JavaScript的一个类,有点类似于java中的自动装箱。但既然是个类,我们就可以new一个Number对象出来,但该对象与Number()还是有区别的,使用时要注意。

1
2
3
4
5
6
7
8
9
10
11
var a = new Number('12')
var b = Number('12')

console.log(typeof a) // "object"
console.log(typeof b) // "number"

console.log(a === 12) // false
console.log(b === 12) // true

// 需要使用a.valueOf()才能得到数值
console.log(a.valueOf() === 12) // true

好了,其实我们基本不需要new一个Number对象再使用的,下面来看一下Number(x)对输入的值会进行怎样的转换。

  • 对小数点后面位数的处理,末尾有0时,转换后一律去掉,其余小数位保留。
1
2
3
4
5
6
console.log(Number("12.12"))     // 12.12
console.log(Number("12.00")) // 12
console.log(Number("12.1")) // 12.1
console.log(Number("12.0")) // 12
console.log(Number("12.10")) // 12.1
console.log(Number("12.11000")) // 12.11
  • null和空字符串的处理,会转换成0。
1
2
console.log(Number(null))        // 0
console.log(Number('')) // 1
  • 对布尔类型的处理,false会转换成0,true会转换成1。
1
2
console.log(Number(false))       // 0
console.log(Number(true)) // 1
  • 对非法数值字符串的处理,一律转换成NaN
1
2
console.log(Number('foo'))       // NaN
console.log(Number('12a')) // NaN
  • undefined的处理,会转换成NaN
1
console.log(Number(undefined))   // NaN
  • Date类型的处理,会返回给定Date值距离1970年1月1日凌晨的毫秒数。
1
console.log(Number(new Date('2016-07-19T20:23:01.804Z')))                        // 1468959781804
  • 对二进制、八进制、十六进制的处理,会返回其对应的十进制数值,也可以指定为其他任意进制。
1
2
3
console.log(Number('0x11'))    // 17
console.log(Number('0b11')) // 3
console.log(Number('0o11')) // 9

parseInt(x)

parseInt只是JavaScript中的一个函数方法,它的语法如下:

1
parseInt(string, radix)

也就是说parseInt主要将字符串转换成整数值,并且可以指定要转成哪个进制的整型值。

parseInt对输入值的处理有以下几个特点:

  • 逐个扫描输入的字符串,遇到不能转换的字符就停止扫面,将前面转换出的值返回,如果第一个字符就无法转换,则返回NaN
1
2
console.log(parseInt('ab'))        // NaN
console.log(parseInt('12ab')) // 12
  • 如果传入的参数是数值,会调用toString将其转为字符串,然后再按照处理字符串的规则进行转换,所以下面这些都转换会转换为4,.不在十进制里。
1
2
3
parseInt(4.7, 10);              // 4
parseInt(4.7 * 1e22, 10); // 4
parseInt(0.00000000000434, 10); // 会先将0.00000000000434转换为4.34e-12,所以也返回4
  • 如果指定了转换成哪种进制,如果扫描到字符在该进制中不存在,则该字符和其后面的字符都忽略掉。
1
2
console.log(parseInt('345', 2))       // NaN
console.log(parseInt('FXX123', 16)) // 15
  • 如果没有指定要转换成哪种进制,或者基数为undefined或者0,JavaScript处理的规则如下:
  1. 如果字符串以0x或者0X开头,则基数是16(十六进制)。
  2. 如果字符串以0开头,则基数是8(八进制)或10(十进制),具体由实现环境决定。所以,永远要明确给出radix
  3. 其他字符串开头,一律按照基数为10处理。
1
2
console.log(parseInt('0x11'))      // 17 按照十六进制转换
console.log(parseInt('015')) // 15 按照十进制转换

该用哪个?

  • 如果是数值字符串,用Number(x)parseInt(x)都行。
  • 如果要保留数值后面的小数,就用Number(x)
  • 如果不确定字符串是否是数值字符串,想要进行判断,可用Number(x),它会直接返回NaN,然后用Number.isNaN(value)判断。
  • 空字符串时,Number('')返回0,parseInt('')返回NaN
  • 布尔值时,Number(false)返回0,parseInt(false)返回NaN

本文作者:意林
本文链接:http://shinancao.cn/2020/07/18/JS-Tips-parseInt-Number/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!