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



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



'a' => NaN
'1' => 1
1 => 1
351   8  

8 ответов:

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

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

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

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

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

есть по крайней мере 5 способов сделать это:

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

например

~~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

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

переполнения

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

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

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

моя теория:

  • врет
  • штопать строки
  • статистика
  • результаты JSPerf:)

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

x | 0

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

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

// 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);

префикс строки с + оператора.

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

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

Math.max(input, 0);

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

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

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

Я считаю, что num * 1 прост, понятен и работает для целых чисел и плавает...

вы можете попробовать использовать UnitOf, библиотека преобразования типа измерения и данных, которую мы только что официально выпустили! UnitOf является супер быстрым, небольшим по размеру и эффективным при преобразовании любого типа данных, никогда не бросая ошибку или null/undefined. Значения по умолчанию, которые вы определяете, или значения по умолчанию UnitOf возвращаются при неудачном преобразовании.

//One liner examples
UnitOf.DataType("12.5").toFloat(); //12.5 of type Float is returned. 0 would be returned if conversion failed.
UnitOf.DataType("Not A Num").toInt(10); //10 of type Int is returned as the conversion failed.

//Or as a variable
var unit = UnitOf.DataType("12.5");
unit.toInt(5); //12.5 of type Float is returned. 5 would be returned if the conversion failed.
unit.toFloat(8); // 12 of type Int is returned. 8 would be returned if the conversion failed.

Comments

    Ничего не найдено.