Почему для JavaScript для parseInt по умолчанию используется значение 8?

По умолчанию значение radix равно 8 (если строка начинается с 0) в JavaScript функция parseInt меня раздражает, только потому, что я продолжаю забывать передать необязательный второй аргумент как 10. Я ищу ответ, рассказывающий мне, почему это имеет смысл иметь по умолчанию 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...