Он обрабатывается как восьмеричный (база 8) из-за ведущего 0
, как и ведущий 0x
, сделает его шестнадцатеричным (основание 16). У этого есть длинная и замученная история, и уже не так, как восьмеричные числа написаны в современном JavaScript. В современном JavaScript, использующем строгий режим, восьмеричный восьмизначный формат является синтаксической ошибкой; восьмеричные числа записываются с префиксом 0o
.
В начале (на исходном языке из Netscape и первой и второй спецификаций ECMAScript) ведущая 0
на числовой литерал официально означал восьмеричный (база 8), так же, как ведущий 0x
означает шестнадцатеричный (основание 16):
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
Например, 10
, 012
и 0xA
- все способы записи десятичного числа десять. Это согласуется с некоторыми другими языками с синтаксисом, подобным JavaScript (C, C ++, Java, ...), но это очень запутанно.
Как и в ECMAScript & nbsp; 3, эта форма восьмеричного литерала была понижена к необязательному расширению, а десятичные целочисленные литералы были изменены так, что они не могут иметь начальные нули (если только реализация не включает расширение):
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits(opt)
Но ECMAScript & nbsp; 5 запретил делать это в строгом режиме:
Соответствующая реализация при обработке кода строгого режима (см. 10.1.1) не должна расширять синтаксис NumericLiteral включить OctalIntegerLiteral , как описано в B.1.1 .
blockquote>ECMAScript & nbsp; 6 (ECMAScript 2015) вводит BinaryIntegerLiteral и OctalIntegerLiteral , поэтому теперь мы имеем более когерентные литералы:
- BinaryIntegerLiteral , с префиксом
0b
или0B
.- OctalIntegerLiteral , с префиксом wi th
0o
или0O
.- HexIntegerLiteral с префиксом
0x
или0X
.Старый Расширение OctalIntegerLiteral было переименовано в LegacyOctalIntegerLiteral , которое по-прежнему разрешено в нестрогом режиме.
Заключение
Поэтому, если вы хотите для синтаксического анализа числа в base & nbsp; 8 используйте префиксы
0o
или0O
(не поддерживаемые старыми браузерами) или используйтеparseInt
.И если вы хотите быть уверены, что ваши номера будут
Примеры
010
В строгом режиме (требуется ECMAScript 5), это синтаксическая ошибка , В нестрогом режиме это может быть синтаксическая ошибка или возврат8
(зависит от реализации).0o10
,0O10
Перед ECMAScript 6 они являются синтаксическими ошибками. В ECMAScript 6 они возвращаются8
.parseInt('010', 8)
Он возвращает8
.parseInt('010', 10)
Он возвращает10
.Если вам интересно, вы можете найти текущую текущую спецификацию здесь и исторические версии здесь .
В разное время вы можете измерить время, когда имеете дело с куда.
Вот некоторые решения, которые вы можете попробовать: