Попробуйте выполнить следующее в JavaScript:
parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!
Я только что усвоил сложный способ, которым JavaScript думает, что ведущий ноль указывает восьмеричное целое число , и, поскольку в base-8 нет "8"
ни одного, или "9"
функция возвращает ноль. Как ни крути, это по замыслу .
Какие обходные пути?
Примечание. Для полноты картины я собираюсь опубликовать решение, но это решение, которое я ненавижу, поэтому, пожалуйста, публикуйте другие / лучшие ответы.
Обновить:
В 5-м издании стандарта JavaScript ( ECMA-262 ) вводятся серьезные изменения, устраняющие это поведение. У Mozilla хорошая рецензия .
10
(десятичное), если только перед анализируемым числом не указан префикс 0x
, например 0xFF
, в этом случае для базового параметра по умолчанию установлено значение 16. Надеюсь, однажды эта проблема будет далеким воспоминанием.
+'08' === 8
? Правда! Может быть, вам действительно нужен parseInt
ваш реальный код, но не выше.
Number('08')
0
или undefined
и номер строки начинается с 0
цифры, за которой не следует x
ни « X
, ни» , тогда реализация может по своему усмотрению интерпретировать число как восьмеричное или как десятичное. В этом случае реализации рекомендуется интерпретировать числа как десятичные. " ( мой акцент)