Ответ 1
Я думаю, что мой ответ здесь отвечает на вопрос, но вопрос не совсем дубликат, поэтому я прилагаю копию своего ответа.
история
Проблема в том, что десятичные целочисленные литералы не могут иметь начальные нули:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits(opt)
Однако ECMAScript 3 позволил (в качестве необязательного расширения) проанализировать литералы с ведущими нулями в базе 8:
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
Но ECMAScript 5 запрещает делать это в строгом режиме:
Соответствующая реализация при обработке кода строгого режима (см. 10.1.1) не должна расширять синтаксис NumericLiteral для включения OctalIntegerLiteral, как описано в B.1.1.
ECMAScript 6 представляет BinaryIntegerLiteral и OctalIntegerLiteral, так что теперь у нас есть более связные литералы:
- BinaryIntegerLiteral, с префиксом
0b
или0B
. - OctalIntegerLiteral, с префиксом
0o
или0O
. - HexIntegerLiteral, с префиксом
0x
или0X
.
Старое расширение OctalIntegerLiteral было переименовано в LegacyOctalIntegerLiteral, что по-прежнему разрешено в нестрогом режиме.
Заключение
Поэтому, если вы хотите проанализировать число в базе 8, используйте префиксы 0o
или 0O
(не поддерживаются старыми браузерами) или используйте parseInt
.
И если вы хотите быть уверены, что ваши числа будут проанализированы в базе 10, удалите начальные нули или используйте parseInt
.
Примеры
-
010
- В строгом режиме (требуется ECMAScript 5) он выбрасывает.
- В нестрогом режиме он может выдать или вернуть
8
(зависит от реализации).
-
0o10
,0O10
- До ECMAScript 6 они кидают.
- В ECMAScript 6 они возвращают
8
.
-
parseInt('010', 8)
- Возвращает
8
.
- Возвращает
-
parseInt('010', 10)
- Возвращает
10
.
- Возвращает