你应该停止使用`parseInt()`

2025-05-27

你应该停止使用`parseInt()`

这是我经常看到的情况,你有一些代码,在某个时候你有一个包含数字的变量,它可能来自一个表单,或者来自某些 API 调用的结果,或者其他什么,你想把它转换成一个整数。

例如这样的事情:

const myNumber = '1';

if (parseInt(myNumber, 10) === 1) {
  // do something
}
Enter fullscreen mode Exit fullscreen mode

虽然上面的代码可以正常工作,但解析起来效率极低。
你应该使用函数Number(),并将上面的代码转换为:

const myNumber = '1';

if (Number(myNumber) === 1) {
  // do something
}
Enter fullscreen mode Exit fullscreen mode

通过上述变化,您可以获得两件事:

  • 更易读的代码
  • 将字符串转换为整数的更高效的方法

Number但是和之间有什么区别parseInt

Number(string)函数计算整个字符串并将其转换为字符串,如果字符串不是数字,则直接返回NaN。While
函数parseInt(string, [radix])会尝试在传递的字符串中找到第一个数字,并将其转换为传递的基数(默认情况下),并且只有在未找到任何数字时10才会返回。NaN

这意味着如果你传递一个类似的字符串5e2parseInt当它看到时它将停止e并返回5,而Number将评估整个字符串并返回正确的值500

这里你可以看到这两个函数之间的一些比较情况:

console.log(Number('a')); // NaN
console.log(Number('1')); // 1
console.log(Number('5e2')); // 500
console.log(Number('16px')); // NaN
console.log(Number('3.2')); // 3.2

console.log(parseInt('a')); // NaN
console.log(parseInt('1')); // 1
console.log(parseInt('5e2')); // 5
console.log(parseInt('16px')); // 16
console.log(parseInt('3.2')); // 3
Enter fullscreen mode Exit fullscreen mode

这也是执行时间的问题

也许你还在犹豫,会想“我只需要把一个简单的数字转换成整数,为什么还要用 Number 呢?”
嗯,因为性能原因。

Number例如,让我们做一个简单的函数,循环 100m 次,并接受一个回调,我们在第一种情况和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
Enter fullscreen mode Exit fullscreen mode

当然,您不会运行 1 亿次循环,但这是为了明显地显示两个函数之间的性能差异,而且当您parseInt在同一个函数的多个地方使用时,事情可能会在最后总结出来。

那么我应该一直避免吗parseInt

不,并非总是如此。当然,在某些情况下使用它是有益的,例如,如果你想从一个浮点数推断出一个整数,这比 快 50% Math.round()
例如,如果你想将一个带有像素的字符串转换为一个数字,比如32px32那么你应该使用parseInt,但大多数情况下你最好还是使用Number
或者,即使你想将一个十进制数字转换为其他格式。

结论

除非在某些特殊情况下,parseInt返回您需要的内容而Number没有返回,否则 99% 的情况下您最好开始使用后者。

更新:更多基准测试

为了提供更广泛的了解,因为有更多的方法可以将字符串转换为数字,我还添加了使用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
Enter fullscreen mode Exit fullscreen mode

正如您上面看到的,使用Number()仍然是进行转换的最快方法。

文章来源:https://dev.to/darkmavis1980/you-should-stop-using-parseint-nbf
PREV
静态网站生成器——无人谈论的 WordPress 替代方案
NEXT
我正在改变我审查代码的方式