parseInt() 和 Number() 选哪个

转载于公众号大迁世界——《请别再使用parseInt()了》一文

Number()和parseInt()的区别

Number()parseInt()的参数为字符串时

Number()函数评估整个字符串并将其转换为数字,如果这个字符串不是一个数字,就返回NaN

Number() // 0
Number('') // 0
Number('abc') // NaN
Number('abc123') // NaN

parseInt(string,[radix])函数会尝试在传递的字符串中找开头的整数,将其转换为传递的进制,进制默认为10,如果开头不是整数,则返回NaN

意思是,刚传递'5e2'这样的字符串,parseInt会在看到'e'时停止,因此只会返回'5',而Number则评估整个字符串并返回正确的值
在这里插入图片描述

可以发现这两个函数之间有一些不同:Number()评估整个字符串,parseInt()找开头的整数

Number('a'); // NaN
Number('1'); // 1
Number('5e2'); // 500
Number('16px'); // NaN
Number('3.2'); // 3.2
Number('px16'); // NaN

parseInt('a'); // NaN
parseInt('1'); // 1
parseInt('5e2'); // 5
parseInt('16px'); // 16
parseInt('3.2'); // 3
parseInt('px16'); // NaN
性能上的区别

假设有这样一个简单的函数,循环一亿次,并接受回调,现在让我们调用这个函数两次,第一次使用Number,第二种使用parseInt

function runBench(cb) {
  const start = new Date();
  for (let i = 0; i < 100000000; i++) {
    cb();
  }
  const end = new Date();
  console.log(`It took ${end - start} ms`);
}

const process1 = () => Number('3.2');
const process2 = () => parseInt('3.2', 10);

runBench(process1); // It took 140 ms
runBench(process2); // It took 4546 ms

实际情况下当然不可能运行1亿次循环,这里是为了让两个函数之间的性能差异变得明显。还有一点是,当你在同一个函数的多个地方使用parseInt时,最后结果可能就直接计算总和了

那我们应该一直避免使用parseInt吗?

并非如此,在某些用例中使用parseInt()是有益的

比如你想从浮点数中推断出一个整数,那么Number()不能实现,而parseInt()Math.round()快50%

还有,如果想将一个带有像素的字符串转换为数字,比如'32px'转换为32,那么应该使用parseInt(),但大多数时候还是推荐使用Number()

更多基准测试

因为还有其他方法可以将字符串转换为数字,下面我将使用parseFloat()和一元运算符添加测试,请看结果:

function runBench(cb) {
  const start = new Date();
  for (let i = 0; i < 100000000; i++) {
    cb();
  }
  const end = new Date();
  console.log(`It took ${end - start} ms`);
}

const process1 = () => Number('1');
const process2 = () => parseInt('1', 10);
const process3 = () => parseFloat('1');
const process4 = () => +'1';

runBench(process1); // It took 70 ms
runBench(process2); // It took 4552 ms
runBench(process3); // It took 5082 ms
runBench(process4); // It took 412 ms

可以看到,使用Number()仍然是最快的转换方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Integer.parseInt"和"Integer.valueOf"都是Java语言中用于将字符串转换为整数的方法,但它们之间有一些细微的区别。 首先,两个方法的返回值不同。使用"Integer.parseInt"方法将字符串转换为int类型的基本数据类型,而"Integer.valueOf"方法将字符串转换为Integer类型的包装类对象。 其次,对于输入的字符串格式也有不同的要求。"Integer.parseInt"方法只能接受数字格式的字符串作为输入,如果输入的字符串不是合法的数字格式,将会抛出NumberFormatException异常。而"Integer.valueOf"方法可以接受一些特殊格式的字符串,比如"10"、"0x10"或者"-10"等。如果输入的字符串不能转换为整数,"Integer.valueOf"方法会返回一个NumberFormatException异常。 此外,两个方法对于处理null值的方式也有所不同。如果将null作为参数传递给"Integer.parseInt"方法,将会抛出NullPointerException异常。而"Integer.valueOf"方法将会返回一个值为null的Integer对象。 最后,两个方法在性能上也略有不同。"Integer.parseInt"方法的性能相对较好,因为它直接返回一个int类型的值。而"Integer.valueOf"方法的性能较差,因为它返回一个Integer对象,需要进行装箱操作。 综上所述,"Integer.parseInt"和"Integer.valueOf"虽然都可以实现将字符串转换为整数的功能,但在使用时需要根据具体的需求来择使用哪个方法。 ### 回答2: parseInt()和valueOf()都是用于将字符串转换为整数的方法,但在使用上有一些细微的区别。 1. 返回类型不同: - parseInt()方法返回一个基本数据类型整数(int),不会返回Integer对象。 - valueOf()方法返回一个Integer对象。 2. 异常处理不同: - parseInt()方法在解析字符串时,如果无法识别为整数,则会抛出NumberFormatException异常。 - valueOf()方法在解析字符串时,如果无法识别为整数,则直接返回null,不会抛出异常。 3. 使用场景不同: - parseInt()方法常用于将字符串转换为整数后进行数值运算,因为返回的是基本数据类型,可以直接参与运算。 - valueOf()方法常用于需要以对象形式存储整数的场景,可以方便地进行对象之间的比较、执行方法等操作。 例如: ``` String str = "123"; int num = Integer.parseInt(str); System.out.println(num); // 输出:123 String str2 = "456"; Integer num2 = Integer.valueOf(str2); System.out.println(num2); // 输出:456 ``` 需要注意的是,当字符串无法解析为整数时,两个方法的处理方式不同: ``` String str3 = "abc"; int num3 = Integer.parseInt(str3); System.out.println(num3); // 抛出NumberFormatException异常 String str4 = "def"; Integer num4 = Integer.valueOf(str4); System.out.println(num4); // 输出:null ``` 综上所述,parseInt()和valueOf()方法在字符串转换为整数时有些许差异,根据具体场景需求择使用。 ### 回答3: parseInt和valueOf都是用于将字符串转换为整数的方法。 parseInt是一个静态方法,它将接收一个字符串参数,并尝试将其解析为整数。它从字符串的开头开始解析,直到遇到非数字字符为止。如果字符串的开头是空格,空字符串或非数字字符,则parseInt将返回NaN(Not a Number)。 parseInt还可以接收一个可的参数,称为基数,用于指定解析的进制,例如十六进制或八进制。 valueOf是一个实例方法,它可以在整数对象上调用。它将返回该整数对象的原始值,这个值是一个原始的数值类型,而不是一个对象。因此,valueOf方法将整数对象转换为对应的整数值。 总结起来,parseInt把字符串解析为整数并返回,而valueOf将整数对象转换为整数值并返回。两者的主要区别在于使用方式和返回值类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值