Я читаю это, но меня смущает то, что написано в parseInt с главой аргумента radix
Почему это parseInt(8, 3)
→ NaN
и parseInt(16, 3)
→ 1
?
AFAIK 8 и 16 не являются номерами base-3, поэтому parseInt(16, 3)
должны возвращаться NaN
тоже
javascript
numbers
parseint
radix
Дэвид Фаринелли
источник
источник
Ответы:
Это то, о чем люди спотыкаются все время, даже когда знают об этом. :-) Вы видите это по той же причине
parseInt("1abc")
возвращает 1:parseInt
останавливается на первом недопустимом символе и возвращает все, что у него есть в этой точке. Если нет подходящих символов для анализа, он возвращаетсяNaN
.parseInt(8, 3)
означает «анализ"8"
в базе 3» (обратите внимание, что он преобразует число8
в строку; подробности в спецификации ). Но в базе 3, одноразрядные числа просто0
,1
и2
. Это все равно что просить его разобрать"9"
в восьмеричном виде. Поскольку не было ни одного действительных символов, вы получилиNaN
.parseInt(16, 3)
просит его проанализировать"16"
в базе 3. Так как он может анализировать1
, он делает, а затем останавливается на6
потому, что он не может проанализировать его. Так и возвращается1
.Поскольку этому вопросу уделяется много внимания и он может быть высоко оценен в результатах поиска, вот краткое изложение вариантов преобразования строк в числа в JavaScript с их различными особенностями и приложениями (взято из другого моего ответа здесь, на SO):
parseInt(str[, radix])
- Преобразует как можно большую часть начала строки в целое (целое) число, игнорируя дополнительные символы в конце. Так иparseInt("10x")
есть10
;x
игнорируется. Поддерживает необязательный аргумент radix (number base),parseInt("15", 16)
как и21
(15
в шестнадцатеричном виде) Если основание отсутствует, предполагается десятичное число, если строка не начинается с0x
(или0X
), и в этом случае она пропускает их и принимает шестнадцатеричное значение. (Некоторые браузеры использовали строки, начинающиеся с0
восьмеричного; такое поведение никогда не указывалось, и было специально запрещено в спецификации ES5.) Возвращает,NaN
если не найдено разборчивых цифр.parseFloat(str)
- НравитсяparseInt
, но делает числа с плавающей запятой и поддерживает только десятичные. Снова дополнительные символы в строке игнорируются,parseFloat("10.5x")
как и10.5
(x
игнорируется). Как только десятичный поддерживаются,parseFloat("0x15")
это0
(поскольку анализ заканчивается наx
). Возвращает,NaN
если не найдено разборчивых цифр.Унарный
+
, например+str
- (например, неявное преобразование) Преобразует всю строку в число, используя числа с плавающей запятой и стандартную нотацию JavaScript (только цифры и десятичная точка = десятичная;0x
префикс = шестнадцатеричный;0o
префикс = восьмеричный [ES2015 +]; некоторые реализации расширяют его рассматривать ведущий0
как восьмеричное, но не в строгом режиме).+"10x"
этоNaN
потому , чтоx
это не игнорируется.+"10"
это10
,+"10.5"
это10.5
,+"0x15"
это21
,+"0o10"
это8
[ES2015 +]. Имеет Гоча:+""
это0
неNaN
как вы могли бы ожидать.Number(str)
- Точно так же, как неявное преобразование (например, как унарный+
выше), но медленнее в некоторых реализациях. (Не то чтобы это могло иметь значение.)источник
parseInt
первое использованиеtoString
по первому аргументу? Это имело бы смысл.parseInt
алгоритма: ecma-international.org/ecma-262/7.0/…123e-2
дает,1
так как он1.23
сначала превращается в , а затем синтаксический анализ останавливается на десятичной запятой?NumberFormatException
каждый раз.parseInt
(приведение первого аргумента к строке) имеет смысл. ЦельparseInt
состоит в том, чтобы разобрать строку в целое число. Так что, если вы даете ему что-то, что не является строкой, имеет смысл начинать с строкового представления. То, что он делает после этого, - целая «другая история»По той же причине, что
В ДоПе ,
parseInt
принимает строку. ИИтак
16
,8
или'1foobar'
сначала преобразуется в строку.затем
Это означает, что он преобразуется туда, где может. Символы
6
,8
иfoobar
игнорируются, и преобразуется только то, что перед ними. Если ничего нет,NaN
возвращается.источник
Еще несколько примеров:
источник