【问题标题】:What is the most efficient way to convert a string to a number?将字符串转换为数字的最有效方法是什么?
【发布时间】:2020-10-24 15:06:44
【问题描述】:

什么是最有效和最安全的方法将十进制 整数 字符串转换为时间关键的循环或函数中的数字,其中有数千个(有时是 100 的数千个)不同的数字字符串 (但都是整数)。

我知道以下三 (3) 种 JavaScript 方法。不确定是否有其他方法可以更有效地完成任务。

  • Number() 将字符串或其他值转换为 Number 类型。如果值不能转换,则返回 NaN。

  • parseInt() 解析字符串参数并返回指定基数的“整数”。

  • '+'前缀字符串会将字符串转换为数字类型。

这也会受到实施、系统或环境/浏览器的影响吗?

我运行了以下测试示例,以确保每个方法的输出结果正确为数字类型。

//  ------- test -------

let MyInegerString  = "12345678901";

let n1 = Number(MyInegerString); 
let n2 = parseInt(MyInegerString);
let n3 = + MyInegerString;

console.log("n1 using Number()   is now a "+typeof(n1));  // "number"
console.log("n2 using parseInt() is now a "+typeof(n2));  // "number"
console.log("n3 using '+'        is now a "+typeof(n3));  // "number"

【问题讨论】:

  • 我不确定是否存在“十进制整数字符串”之类的东西。您的意思是将字符串转换为数字? JS不关心数字是否为整数。
  • 您是否对列出的选项进行了任何基准测试以找出答案?
  • 如果我必须选择,我认为Number() 会是最慢的,但它依赖于实现,并且几乎都将以相同的速度运行。
  • 我会担心为什么在用户浏览器中执行如此重要的操作。
  • 测量测量测量。

标签: javascript type-conversion numbers


【解决方案1】:

我是堆栈的新手,如果我的结构有误,请原谅我。

您列出了 3 种将字符串转换为数字的方法,您可以使用 Number() 作为 ES6 构造函数 new Number(),因此我也将其包含在测试中。

我做了一个测试,多次使用四种字符串到数字的转换方法,并检查它们需要多长时间才能运行。通过在节点 JS 和 chrome 浏览器中运行此测试,都在 Linux 系统上,我发现在节点 JS 中运行 10,000,000(30,000,000 作为函数测试 3 个不同的字符串)时,Number() 函数首先出现在 12 毫秒到完成,使用松散类型进行转换需要 13 毫秒,然后 parseInt() 排在第三位,需要 99 毫秒来转换数字,最后,Number() 构造函数需要 1010 毫秒才能完成。在 chrome 中运行同样的测试,Number() 函数耗时 13ms,松散类型转换耗时 16ms,parseInt() 函数耗时 287ms,Number() 构造函数耗时 1083ms。

我的测试功能如下

const testStringConversion = (timesToTest) => {
  console.log(`Testing Number() constructor ${timesToTest} times`);
  let timer, number;
  timer = Date.now();
  for (let i = 0; i !== timesToTest; ++i) {
    number = new Number("3");
    number = new Number("6");
    number = new Number("123456");
  }
  console.log(`Took ${Date.now() - timer} ms to complete`);

  console.log(`Testing Number() function ${timesToTest} times`);

  timer = Date.now();
  for (let i = 0; i !== timesToTest; ++i) {
    number = Number("3");
    number = Number("6");
    number = Number("123456");
  }
  console.log(`Took ${Date.now() - timer} ms to complete`);

  console.log(`Testing parseInt() ${timesToTest} times`);

  timer = Date.now();
  for (let i = 0; i !== timesToTest; ++i) {
    number = parseInt("3", 10);
    number = parseInt("6", 10);
    number = parseInt("123456", 10);
  }
  console.log(`Took ${Date.now() - timer} ms to complete`);

  console.log(
    `Testing loose type addition to convert numbers ${timesToTest} times`
  );

  timer = Date.now();
  for (let i = 0; i !== timesToTest; ++i) {
    number = + "3";
    number = + "6";
    number = + "123456";
  }
  console.log(`Took ${Date.now() - timer} ms to complete`);
};

testStringConversion(10000000);

我希望这可以帮助您找到所需的内容:)

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多