Есть ли какие-либо побочные эффекты использования этого метода для преобразования строки в целое число - PullRequest
6 голосов
/ 13 ноября 2011

Есть ли какие-либо побочные эффекты, если я преобразую строку в число, как показано ниже?

Пожалуйста, дайте мне знать, если есть какие-либо опасения по поводу использования этого метода.

1 Ответ

25 голосов
/ 13 ноября 2011

Когда вы используете parseFloat или parseInt, преобразование менее строгое. 1b5 -> 1.

Использование 1*number или +number для преобразования приведет к NaN, когда введенные данные недопустимы. Хотя в отличие от parseInt, числа с плавающей запятой будут анализироваться правильно.

Таблица, охватывающая все возможные соответствующие опции.

//Variables    // parseInt  parseFloat  + 1* /1   ~~ |0 ^1 >>0  >>>0
var a = '123,',//   123        123       NaN       0     & <<0   0
    b = '1.e3',//   1          1000      1000      1000          1000
    c = '1.21',//   1          1.21      1.21      1             1
    d = '0020',//   16         20        20        20            20
    e = '0x10',//   16         0         16        16            16
    f = '3e9', //   3          3000000000  <--    -1294967296    3000000000
    g = '3e10',//   3          30000000000 <--    -64771072      4230196224
    h = 3e25  ,//   3          3e+25     3e+25     0             0
    i = '3e25',//   3          3e+25     3e+25     0             0
    j = 'a123',//   NaN        NaN       NaN       0             0
    k = '  1 ',//   1          1         1         1             1
    l = '    ',//   NaN        NaN       0         0             0
    m = '.1  ',//   NaN        0.1       0.1       1             1
    n = '1.  ',//   1          1         1         1             1
    o = '1e999',//  1          Infinity  Infinity  0             0
    p = '1e-999',// 1          0         0         0             0
    q = false ,//   NaN        NaN       0         0             0
    r = void 0,//   NaN        NaN       NaN       0             0
    _ = function(){return 1;}, /* Function _ used below */
    s={valueOf:_},//NaN        NaN       1         1             1
    t={toString:_};// 1        1         1         1             1

// Intervals: (-1e+20, +1e20)  (-∞,+∞)   (-∞,+∞)   (-2³¹,+2³¹)   [0, 2³²)
// In FF9 and Chrome 17, Infinity === Math.pow(2, 1024), approx. 1.7976e+308
// In FF9 and Chrome 17, bitwise operators always return 0 after about ±1e+25

Примечания о методах преобразования чисел:

  • Преобразование чисел всегда завершается неудачей, если первый символ после усечения пробела не является числом.
  • parseInt возвращает целочисленное представление первого аргумента. Когда основание (второй аргумент) опущено, оно зависит от заданного ввода.
    0_ = восьмеричное (основание-8), 0x_ = шестнадцатеричное (основание-16). По умолчанию: base-10.
    parseInt игнорирует любые нецифровые символы, даже если аргумент на самом деле был числом: см. h, i .
    Чтобы избежать неожиданных результатов, всегда указывайте основание, обычно 10: parseInt(number, 10).
  • parseFloat является наиболее допустимым преобразователем. Он всегда интерпретирует ввод как base-10, независимо от префикса (в отличие от parseInt). Точные правила синтаксического анализа см. здесь .

    Следующие методы всегда не смогут вернуть значащее значение, если строка содержит любые нечисловые символы. (допустимые примеры: 1.e+0 .1e-1)
  • +n, 1*n, n*1, n/1 и Number(n) эквивалентны.
  • ~~n, 0|n, n|0, n^1, 1^n, n&n, n<<0 и n>>0 эквивалентны. Это побитовые операции со знаком, всегда возвращающие числовое значение (ноль вместо NaN).
  • n>>>0 также является побитовой операцией , но не резервирует знаковый бит. Следовательно, могут быть представлены только положительные числа, и верхняя граница равна 2 32 вместо 2 31 .

  • При передаче объекта parseFloat и parseInt будут смотреть только на метод .toString(). Другие методы сначала ищут .valueOf(), затем .toString(). См. q - t .

  • NaN, «Не число»:
    typeof NaN === 'number'
    NaN !== NaN. Из-за этой неловкости используйте isNaN(), чтобы проверить, является ли значение NaN.

Когда использовать какой метод?

  • parseFloat( x ) когда вы хотите получить как можно больше числовых результатов (для заданной строки).
  • parseFloat( (x+'').replace(/^[^0-9.-]+/,'') ), если вам нужны еще более числовые результаты.
  • parseInt( x, 10 ), если вы хотите получить целые числа.
  • +x, 1*x .., если вас интересует только получение истинных числовых значений объекта, отклонение любых недопустимых чисел (как NaN).
  • ~~, 0| .., если вы хотите всегда получать числовой результат (ноль для недействительного).
  • >>>0 если отрицательных чисел не существует.
    Последние два метода имеют ограниченный диапазон. Взгляните на нижний колонтитул таблицы.

Кратчайший способ проверить, является ли данный параметр действительным числом , объяснен на этот ответ :

function isNumber(n) {
    return typeof n == 'number' && !isNaN(n - n);
}
...