Javascript parseInt () с ведущими нулями - PullRequest
110 голосов
/ 06 января 2012

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

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 ]

Ответы [ 7 ]

170 голосов
/ 06 января 2012

Это потому, что если число начинается с «0», оно считается основанием 8 (восьмеричное).

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

parseInt("09", 10) // 9

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

38 голосов
/ 06 января 2012

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

parseInt("08", 10);

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

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

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

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

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

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

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

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

15 голосов
/ 06 января 2012

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

parseInt(value, base)

Где основание - основание.

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

parseInt(value, 10);
4 голосов
/ 09 мая 2013

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

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

2 голосов
/ 10 июля 2015

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

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

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

0 голосов
/ 01 февраля 2017

Похоже, что проблема изменилась в большинстве браузеров.

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)
0 голосов
/ 28 октября 2014

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

// 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...