Игнасио Васкес-Абрамс прав, но давайте посмотрим, как именно это работает ...
От 15.1.2.2 parseInt (string , radix)
:
Когда вызывается функция parseInt, предпринимаются следующие шаги:
- Пусть inputString будет ToString (string).
- Пусть S будет вновь созданной подстрокой inputString, состоящей из первого символа, который не является StrWhiteSpaceChar, и всех символов, следующих за этим символом. (Другими словами, удалите начальные пробелы.)
- Пусть знак будет 1.
- Если S не является пустым и первый символ S является знаком минус -, пусть знак будет -1.
- Если S не является пустым и первый символ S является знаком плюс + или минус -, то удалите первый символ из S.
- Пусть R = ToInt32 (основание).
- Пусть stripPrefix будет правдой.
- Если R ≠ 0, то а. Если R <2 или R> 36, то вернуть NaN. б. Если R ≠ 16, пусть stripPrefix будет ложным.
- Иначе, R = 0 а. Пусть R = 10.
- Если stripPrefix имеет значение true, тогда a. Если длина S не менее 2 и первые два символа S равны «0x» или «0X», то удалите первые два символа из S и пусть R = 16.
- Если S содержит любой символ, который не является цифрой радикс-R, то пусть Z будет подстрокой S, состоящей из всех символов перед первым таким символом; в противном случае пусть Z будет S.
- Если Z пусто, вернуть NaN.
- Пусть mathInt будет математическим целочисленным значением, которое представлено Z в обозначении radix-R, используя буквы AZ и az для цифр со значениями от 10 до 35. (Однако, если R равно 10 и Z содержит более 20 значащих цифр, каждая значащая цифра после 20-го числа может быть заменена цифрой 0 по выбору реализации, и если R не равен 2, 4, 8, 10, 16 или 32, тогда mathInt может быть зависимым от реализации приближением математического целого числа значение, которое представлено Z в обозначении radix-R.)
- Пусть number будет числовым значением для mathInt.
- Вернуть знак × номер.
ПРИМЕЧАНИЕ parseInt может интерпретировать только начальную часть строки как целочисленное значение; он игнорирует любые символы, которые не могут быть интерпретированы как часть записи целого числа, и не указывается, что любые такие символы были проигнорированы.
Здесь есть две важные части. Я смел их обоих. Итак, прежде всего, мы должны выяснить, что такое toString
представление null
. Нам нужно посмотреть Table 13 — ToString Conversions
в разделе 9.8.0 эту информацию:
Отлично, теперь мы знаем, что toString(null)
внутреннее выполнение дает 'null'
строку. Отлично, но как именно он обрабатывает цифры (символы), которые недопустимы в пределах предоставленного radix?
Мы смотрим выше 15.1.2.2
и видим следующее замечание:
Если S содержит любой символ, который не является цифрой радикс-R, то пусть Z будет подстрокой S, состоящей из всех символов перед первым таким символом; в противном случае пусть Z будет S.
Это означает, что мы обрабатываем все цифры PRIOR до указанного радиуса и игнорируем все остальное.
По сути, делать parseInt(null, 23)
то же самое, что и parseInt('null', 23)
. u
Вызывает два l
«S игнорируются (даже если они являются частью радикса 23). Таким образом, мы можем только анализировать n
, делая весь оператор синонимом parseInt('n', 23)
. :)
В любом случае, отличный вопрос!