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)