Какой самый быстрый способ преобразования String в Number в JavaScript?

Любое число, это число. Строка выглядит как число, это число. Все остальное, это NaN.

'a' => NaN
'1' => 1
1 => 1

Ответ 1

Есть 4 способа сделать это, насколько я знаю.

Number(x);
parseInt(x, 10);
parseFloat(x);
+x;

В результате этого быстрого теста, который я сделал, это действительно зависит от браузеров.

http://jsperf.com/best-of-string-to-number-conversion/2

Implicit отмечен самым быстрым в 3 браузерах, но он делает код трудным для чтения... Поэтому выбирайте все, что вам нравится!

Ответ 2

Существует не менее 5 способов сделать это:

Если вы хотите преобразовать только в целые числа, другой быстрый (и короткий) способ - это double-bitwise not (т.е. использование двух тильд-символов):

например.

~~x;

Ссылка: http://james.padolsey.com/cool-stuff/double-bitwise-not/

5 общих путей, которые я знаю до сих пор, чтобы преобразовать строку в число, имеют свои отличия (работают более побитовые операторы, но все они дают тот же результат, что и ~~). Этот JSFiddle показывает различные результаты, которые можно ожидать в консоли отладки: http://jsfiddle.net/TrueBlueAussie/j7x0q0e3/22/

var values = ["123",
          undefined,
          "not a number",
          "123.45",
          "1234 error",
          "2147483648",
          "4999999999"
          ];

for (var i = 0; i < values.length; i++){
    var x = values[i];

    console.log(x);
    console.log(" Number(x) = " + Number(x));
    console.log(" parseInt(x, 10) = " + parseInt(x, 10));
    console.log(" parseFloat(x) = " + parseFloat(x));
    console.log(" +x = " + +x);
    console.log(" ~~x = " + ~~x);
}

Консоль отладки:

123
  Number(x) = 123
  parseInt(x, 10) = 123
  parseFloat(x) = 123
  +x = 123
  ~~x = 123
undefined
  Number(x) = NaN
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = NaN
  ~~x = 0
null
  Number(x) = 0
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = 0
  ~~x = 0
"not a number"
  Number(x) = NaN
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = NaN
  ~~x = 0
123.45
  Number(x) = 123.45
  parseInt(x, 10) = 123
  parseFloat(x) = 123.45
  +x = 123.45
  ~~x = 123
1234 error
  Number(x) = NaN
  parseInt(x, 10) = 1234
  parseFloat(x) = 1234
  +x = NaN
  ~~x = 0
2147483648
  Number(x) = 2147483648
  parseInt(x, 10) = 2147483648
  parseFloat(x) = 2147483648
  +x = 2147483648
  ~~x = -2147483648
4999999999
  Number(x) = 4999999999
  parseInt(x, 10) = 4999999999
  parseFloat(x) = 4999999999
  +x = 4999999999
  ~~x = 705032703

Версия ~~x приводит к числу в "более" случаях, где другие часто приводят к undefined, но он терпит неудачу для недопустимого ввода (например, он вернет 0, если строка содержит не числовые символы после действительное число).

Переполнение

Обратите внимание: Целочисленное переполнение и/или усечение бит могут возникать с ~~, но не с другими преобразованиями. В то время как необычно вводить такие большие значения, вы должны знать об этом. Пример обновлен, чтобы включить гораздо большие значения.

Некоторые тесты Perf показывают, что стандартные функции parseInt и parseFloat на самом деле являются самыми быстрыми параметрами, которые, по-видимому, очень оптимизированы браузерами, но все зависит от вашего требования, поскольку все параметры достаточно быстрые: http://jsperf.com/best-of-string-to-number-conversion/37

Все зависит от того, как перфорированные тесты настроены так, как некоторые показывают, что parseInt/parseFloat будет намного медленнее.

Моя теория такова:

  • Lies
  • Штриховые линии
  • Статистика
  • Результаты JSPerf:)

Ответ 3

Быстрый способ преобразования строк в целое число состоит в использовании поразрядного или, например:

x | 0

В то время как это зависит от того, как оно реализовано, теоретически оно должно быть относительно быстрым (по крайней мере, так быстро, как +x), поскольку оно сначала будет отличать x от числа, а затем выполнить очень эффективное или.

Ответ 4

Вот простой способ сделать это: var num = Number (str); в этом примере str - это переменная, содержащая строку. Вы можете протестировать и посмотреть, как он работает: инструменты разработчика Chrome Chrome, затем перейдите в консоль и вставьте следующий код. прочитайте комментарии, чтобы лучше понять, как делается конверсия.

// Here Im creating my variable as a string
var str = "258";


// here im printing the string variable: str
console.log ( str );


// here Im using typeof , this tells me that the variable str is the type: string
console.log ("The variable str is type: " + typeof str);


// here is where the conversion happens
// Number will take the string in the parentesis and transform it to a variable num as type: number
var num = Number(str);
console.log ("The variable num is type: " + typeof num);

Ответ 5

Это, вероятно, не так быстро, но имеет дополнительное преимущество: убедитесь, что ваш номер имеет хотя бы определенное значение (например, 0) или самое большее определенное значение:

Math.max(input, 0);

Если вам нужно обеспечить минимальное значение, обычно вы делаете

var number = Number(input);
if (number < 0) number = 0;

Math.max(..., 0) избавляет вас от написания двух утверждений.

Ответ 6

Префикс строки с помощью оператора +.

console.log(+'a') // NaN
console.log(+'1') // 1
console.log(+1) // 1