У меня есть раздражающая проблема в 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 по таблице выше.
parseInt('Infini',24)
.
n
тоже допустимая цифра, так что на самом деле это заканчивается parseInt("Infini", 24)
.
Вот последовательность событий:
1/0
оценивает Infinity
parseInt
читает Infinity
и радостно отмечает, что I
18 в базе 19parseInt
игнорирует остаток строки, так как он не может быть преобразован.Обратите внимание, что вы получите результат для любой базы >= 19
, но не для баз ниже этой. Для баз >= 24
вы получите больший результат, который n
станет действительной цифрой в этой точке.
parseInt
будет принимать 36, поскольку в английском алфавите 26 букв, и принято использовать цифры, а не буквы как набор действительных цифр в данной базе.
Infinity
на "Infinity"
...
Чтобы добавить к ответам выше:
parseInt предназначен для разбора строк на числа (ключ в названии). В вашей ситуации вы вообще не хотите выполнять синтаксический анализ, поскольку 1/0 - это уже число, так что это странный выбор функции. Если у вас есть число (которое у вас есть) и вы хотите преобразовать его в конкретную базу, вы должны вместо этого использовать toString с основанием .
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)
или parseInt("I",19)
OR parseInt("i",19)
результат будет таким же , то есть 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
if
может помочь.