Хорошо, поэтому я возился с parseInt, чтобы посмотреть, как он обрабатывает значения, которые еще не инициализированы, и наткнулся на этот драгоценный камень. Ниже происходит для любого радиуса 24 или выше.
parseInt(null, 24) === 23 // evaluates to true
Я протестировал его в IE, Chrome и Firefox, и все они предупреждают об истинности, поэтому я думаю, что это должно быть где-то в спецификации. Быстрый поиск в Google не дал мне никаких результатов, так что я надеюсь, что кто-нибудь сможет объяснить.
Я помню, как слушал речь Крокфорда, в которой он говорил typeof null === "object"
из-за недосмотра, заставляющего Object и Null иметь в памяти почти идентичный идентификатор типа или что-то в этом роде, но сейчас я не могу найти это видео.
Попробуйте это: http://jsfiddle.net/robert/txjwP/
Редактировать Исправление: более высокий основание возвращает разные результаты, 32 возвращает 785077
Редактировать 2 Из zzzzBov:[24...30]:23, 31:714695, 32:785077, 33:859935, 34:939407, 35:1023631, 36:1112745
ТЛ; др
Объясните, почему parseInt(null, 24) === 23
это верное утверждение.
источник
alert(parseInt(null, 34) === 23)
произведеноfalse
alert(parseInt(null,26)===23);
тоже выдает истину?!?![24...30]:23
,31:714695
,32:785077
,33:859935
,34:939407
,35:1023631
,36:1112745
,[37...]:NaN
undefined
как первый параметр возвращает странные результаты за 30-е годыОтветы:
Это преобразование
null
в строку"null"
и попытка преобразовать ее. Для осей от 0 до 23 нет чисел, которые он может преобразовать, поэтому он возвращаетNaN
. В 24,"n"
14-я буква, добавляется к системе счисления. На 31"u"
добавляется 21-я буква, и вся строка может быть декодирована. На этапе 37 больше нет действительного набора чисел, который может быть сгенерирован, и возвращается NaN.источник
toString()
?Мозилла говорит нам :
В спецификации 15.1.2.2/1 говорит нам, что преобразование в строку выполняется с использованием встроенного
ToString
, который (согласно 9.8) дает"null"
(не путать сtoString
, который даст"[object Window]"
!).Итак, давайте рассмотрим
parseInt("null", 24)
.Конечно, это не числовая строка с основанием 24, но «n» это: это десятичное число 23 .
Теперь синтаксический анализ прекращается после удаления десятичного числа 23, потому что
"u"
не найдено в системе base-24:(И именно поэтому
parseInt(null, 23)
(и более низкие радиусы) дает вам,NaN
а не 23:"n"
не в системе base-23.)источник
Игнасио Васкес-Абрамс прав, но давайте посмотрим, как именно это работает ...
От
15.1.2.2 parseInt (string , radix)
:Здесь есть две важные части. Я смел их обоих. Итак, прежде всего, мы должны выяснить, что такое
toString
представлениеnull
. Нам нужно посмотретьTable 13 — ToString Conversions
в разделе 9.8.0 эту информацию:Отлично, теперь мы знаем, что
toString(null)
внутреннее выполнение дает'null'
строку. Отлично, но как именно он обрабатывает цифры (символы), которые недопустимы в пределах предоставленного radix?Мы смотрим выше
15.1.2.2
и видим следующее замечание:Это означает, что мы обрабатываем все цифры PRIOR до указанного радиуса и игнорируем все остальное.
По сути, делать
parseInt(null, 23)
то же самое, что иparseInt('null', 23)
.u
Вызывает дваl
«S игнорируются (даже если они являются частью радикса 23). Таким образом, мы можем только анализироватьn
, делая весь оператор синонимомparseInt('n', 23)
. :)В любом случае, отличный вопрос!
источник
Эквивалентно
что эквивалентно
Цифры для основания 24: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, а, b, c, d, e, f, ..., n.
Спецификация языка говорит
это та часть, которая гарантирует, что целочисленные литералы в стиле C, такие как
15L
parse, правильно, поэтому вышеприведенный эквивалент"n"
является 23-й буквой списка цифр выше.QED
источник
Я думаю,
null
превращается в строку"null"
. Такn
что на самом деле23
в «base24» (то же самое в «base25» +),u
недопустимо в «base24», поэтому остальная часть строкиnull
будет игнорироваться. Вот почему он выводит23
до тех пор, покаu
не станет действительным в «base31».источник
parseInt использует буквенно-цифровое представление, тогда в base-24 «n» допустимо, но «u» является недопустимым символом, тогда parseInt только анализирует значение «n» ....
в качестве примера попробуйте это:
Результат будет «3».
источник