У меня есть раздражающая проблема в JavaScript.
> parseInt(1 / 0, 19)
> 18
 Почему функция parseInt возвращает 18?
У меня есть раздражающая проблема в JavaScript.
> parseInt(1 / 0, 19)
> 18
 Почему функция parseInt возвращает 18?
Результатом 1/0 является Infinity.
 parseInt рассматривает свой первый аргумент как строку, которая означает прежде всего Infinity.toString(), вызывая строку "Infinity". Таким образом, он работает так же, как если бы вы попросили его преобразовать "Infinity" в базу 19 в десятичную.
Вот цифры в базе 19 и их десятичные значения:
Base 19   Base 10 (decimal)
---------------------------
   0            0
   1            1
   2            2
   3            3
   4            4
   5            5
   6            6
   7            7
   8            8
   9            9
   a            10
   b            11
   c            12
   d            13
   e            14
   f            15
   g            16
   h            17
   i            18
Что происходит дальше, так это то, что parseInt сканирует вход "Infinity", чтобы найти, какая часть его может быть проанализирована, и останавливается после принятия первого I (потому что n не является допустимой цифрой в базе 19).
Поэтому он ведет себя так, как если бы вы вызвали parseInt("I", 19), который преобразуется в десятичную строку 18 в таблицу выше.
Здесь последовательность событий:
1/0 оценивается как InfinityparseInt читает Infinity и с радостью отмечает, что I равно 18 в базе 19parseInt игнорирует оставшуюся часть строки, поскольку она не может быть преобразована.Обратите внимание, что вы получите результат для любой базы >= 19, но не для баз ниже. Для базей >= 24 вы получите больший результат, так как n станет действительной цифрой в этой точке.
Чтобы добавить к приведенным выше ответам:
parseInt предназначен для анализа строк в числах (ключ в имени). В вашей ситуации вы вообще не хотите выполнять синтаксический анализ, поскольку 1/0 уже является числом, поэтому это странный выбор функции. Если у вас есть номер (который вы делаете) и хотите преобразовать его в определенную базу, вы должны использовать toString с помощью radix.
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Чтобы добавить к приведенным выше ответам
 parseInt(1/0,19) эквивалентно parseInt("Infinity",19)
Внутри базы 19 чисел 0-9 и A-I (or a-i) являются допустимыми числами. Итак, из "Бесконечности" он берет I базы 19 и преобразует в базу 10, которая становится 18
Затем он пытается взять следующий символ, т.е. n, который отсутствует в базе 19, поэтому отбрасывает следующие символы (в соответствии с javascript-поведением преобразования строки в число)
Итак, если вы пишете parseInt("Infinity",19) OR parseInt("I",19) OR parseInt("I",19), результат будет таким же i.e 18.
Теперь, если вы напишете parseInt("I0",19), результат будет 342
как I X 19 (the base)^1 + 0 X 19^0= 18 X 19^1 + 0 X 19^0= 18 X 19 + 0 X 1= 342
Аналогично, parseInt("I11",19) приведет к 6518
то есть.
  18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 19^2  +   1 X 19^1   +  1 X 19^0
= 18 X 361   +   1 X 19     +  1 X 1
= 6498  +  19  +  1
= 6518