Javascript parseInt() с ведущими нулями

Функция javascript parseInt не работает полностью.

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0

Вы не можете это объяснить. Попробуйте. (JsFiddle)

Изменить. Поскольку этот вопрос задавали и отвечали, "функция" по умолчанию для восьмеричного основания устарела. [1] [2]

Ответ 1

Это связано с тем, что если число начинается с "0", оно обрабатывается как основание 8 (восьмеричное).

Вы можете заставить базу, передав базу в качестве второго параметра.

parseInt("09", 10) // 9

Согласно docs, второй параметр является необязательным, но он не всегда считается равным 10, как вы можете видеть из вашего примера.

Ответ 2

Вызов parseInt должен всегда указывать базу во втором аргументе:

parseInt("08", 10);

Более ранние версии JavaScript обрабатывают строки начиная с 0 как восьмеричные (если база не указана), и ни 08, ни 09 не являются действительными восьмеричными числами.

Из документации Mozilla :

Если radix равен undefined или 0, JavaScript предполагает следующее:

  • Если входная строка начинается с "0x" или "0X", радиус равен 16 (Шестнадцатеричное).
  • Если входная строка начинается с "0", то радиус равен восьми (Восьмеричное). Эта функция нестандартная, и некоторые реализации намеренно не поддерживают его (вместо этого используют radix 10). Для этого Причина всегда указывается при использовании parseInt.
  • Если входная строка начинается с любого другого значения, радиус равен 10 (десятичный).

Если первый символ не может быть преобразован в число, parseInt возвращает NaN.

И из стандарта ECMAScript 3:

Когда radix равен 0 или undefined, а номер строки начинается с 0не сопровождаемый x или X, тогда реализация может на по усмотрению, интерпретировать число либо как восьмеричное, либо как десятичная дробь. Реализациям предлагается интерпретировать номера в этом случай как десятичный.

Последняя версия JavaScript (ECMAScript 5) отказывается от этого поведения, но вы все равно должны указывать радиус для удовлетворения старых браузеров.

Ответ 3

Существует параметр Radix

parseInt(value, base)

Где база является основанием.

В этом случае вы оцениваете base10 (десятичные) числа, поэтому используйте

parseInt(value, 10);

Ответ 4

В новых браузерах это не выглядит полностью. Internet Explorer 9 и 10 вернут 8, если вы выполните 'parseInt ( "08" ), в то время как Internet Explorer 8 и предыдущие версии вернут 0 (режим IE10 в режиме quirks также вернет 0).

Последняя версия Chrome также возвращает 8, поэтому они, должно быть, недавно изменили интерпретацию.

Ответ 5

Этот вопрос сейчас устарел. Но вы все равно можете использовать radix в parseInt для преобразования числа других баз в base-10. Например.

var baseTwoNumber = parseInt('0010001', 2);

возвращает 17 (который является базой-10 из 0010001).

Ответ 6

Совет. Как вы теперь знаете, когда значение по умолчанию для восьмеричного значения устарело. Вот как вы могли бы исправить это в старых браузерах

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
    parseInt = (function (origParseInt) {
        var hexRegex = /^0[xX]/;
        return function parseIntES5(str, radix) {
            str = String(str).trim();
            if (!Number(radix)) {
                radix = hexRegex.test(str) ? 16 : 10;
            }
            return origParseInt(str, radix);
        };
    }(parseInt));
}

Ответ 7

Теперь проблема в большинстве браузеров изменилась.

Firefox 51.0.1 (64-разрядная версия)

parseInt("09")   // 9

Chrome 55.0.2883.95 (64-разрядный)

parseInt("09")   // 9

Safari 10.0 (12602.1.50.0.10)

parseInt("09")   // 9

=====

Рекомендуемая практика

Сказав, что, чтобы быть на более безопасной стороне и избегать проблем, используйте параметр base/radix, как предлагается в принятом ответе.

parseInt("09", 10)    // 9

Дополнительный тест

Я просто хотел проверить это, если аргумент не является строкой. Chrome и Safari дают точный результат. Firefox тоже возвращает правильный результат, но с предупреждением.

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)