Почему parseInt(1/0, 19) возвращает 18?
У меня есть надоедливое проблема в JavaScript.
Я столкнулся с странным поведением функции parseInt
. Вот пример:
> parseInt(1 / 0, 19)
> 18
Почему функция parseInt
возвращает 18
?
2 ответ(ов)
Вот последовательность событий:
- Выражение
1/0
возвращаетInfinity
. - Функция
parseInt
считываетInfinity
и с удовольствием замечает, чтоI
— это 18 в системе счисления с основанием 19. - Функция
parseInt
игнорирует оставшуюся часть строки, поскольку она не может быть преобразована.
Обратите внимание, что вы получите результат для любого основания >= 19
, но не для оснований ниже этого. Для оснований >= 24
вы получите большее значение, так как n
становится допустимой цифрой в этом случае.
Чтобы добавить к уже приведённым ответам:
parseInt(1/0, 19)
эквивалентен parseInt("Infinity", 19)
.
В числах с основанием 19 допустимыми являются цифры от 0
до 9
и буквы A-I
(или a-i
). Из строки "Infinity" функция берет символ I
, который в 19-ричной системе соответствует 18 в десятичной системе. Затем она пытается взять следующий символ — n
, который отсутствует в 19-ричной системе, поэтому все последующие символы игнорируются (это поведение JavaScript при преобразовании строки в число).
Таким образом, если вы вызовете parseInt("Infinity", 19)
или parseInt("I", 19)
или parseInt("i", 19)
, результат будет одинаковым и равным 18
.
Если же вы вызовете parseInt("I0", 19)
, результат будет 342
, так как:
I × 19^1 + 0 × 19^0 = 18 × 19^1 + 0 × 19^0 = 18 × 19 + 0 × 1 = 342
.
Аналогично, вызов parseInt("I11", 19)
даст результат 6518
, что можно рассчитать так:
18 × 19^2 + 1 × 19^1 + 1 × 19^0
= 18 × 19^2 + 1 × 19^1 + 1 × 19^0
= 18 × 361 + 1 × 19 + 1 × 1
= 6498 + 19 + 1
= 6518
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"