По умолчанию значение radix равно 8 (если строка начинается с 0) в JavaScript функция parseInt меня раздражает, только потому, что я продолжаю забывать передать необязательный второй аргумент как 10. Я ищу ответ, рассказывающий мне, почему это имеет смысл иметь по умолчанию 8.
Почему для JavaScript для parseInt по умолчанию используется значение 8?
Ответ 1
Значение по умолчанию равно 8, только если входная строка начинается с 0. Это неудачный перенос с C и C++.
Вместо этого вы можете использовать Number('0123')
или, как вы сказали в вопросе, parseInt('0123', 10)
.
Как мне обойти восьмеричное поведение parseInt в JavaScript?
Можете ли вы рассказать мне больше об этом переходе?
Примечание: строгий режим ECMAScript удаляет восьмеричный синтаксис.
Ответ 2
Если число начинается с 0
и содержит цифры между (и включительно) от 0 до 7, оно интерпретируется как восьмеричное число (с базой 8 вместо 10).
В parseInt, однако, если строка начинается с 0
, она всегда интерпретируется как восьмеричная и прекращает поиск, когда она встречает недопустимый символ (например, цифры 8
или 9
) или символ типа z
).
parseInt("070"); //56
parseInt("70"); //70
parseInt("070", 10); //70
parseInt("78"); //78
parseInt("078"); //7, because it stops before 8
Если вам нужно преобразовать строку в число, и вы уверены, что в ней нет недопустимых символов или дробных частей, вы можете умножить ее на 1, чтобы сделать ее несколько:
1 * "070"; //70
Я лично предпочитаю этот подход и считаю, что это быстрее, чем вызов функций.
Ответ 3
Теперь, спустя пару лет, parseInt()
работает нормально с числами, начинающимися с 0
. Текущие браузеры:
parseInt("019"); // 19 on Firefox 67
parseInt("019"); // 19 on Chrome 75
parseInt("019"); // 19 on Safari 12
parseInt("019"); // 19 on IE 11
parseInt("019"); // 19 on Edge 42
Но все же, это "исправление" должно сломать старые сценарии, которые полагаются на parseInt("019")
возвращая 1
или 0
вместо 19
...