Существуют ли какие-либо побочные эффекты использования этого метода для преобразования строки в целое число

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

var numb=str*1;

Если я проверяю код ниже, он говорит, что это число.

var str="123";
str=str*1;
if(!isNaN(str))
{
  alert('Hello');   
}

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

Ответы

Ответ 1

Когда вы используете 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 возвращает целочисленное представление первого аргумента. Когда radix (второй аргумент) опущен, радиус зависит от данного входа.
    0_= восьмеричный (base-8), 0x_= шестнадцатеричный (base-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);
}