Набираю в консоли Google Chrome следующий пример (и получаю интересный результат):
for (num = 050; num <= 100; num = num + 1) {
console.log(num);
}
Печать почему-то начинается от 40. Если ввести вместо этого num = 50, то от 50. В чем разница этих значений для JavaScript, и почему цикл начинается с 40 в первом случае?
Числа, начинающиеся с нуля, считаются восьмеричными, если в них нет цифр больше 7. Ссылка на справку
Грамматику можно посмотреть в спецификации: 11.8.3 Numeric Literals
В JavaScript определяется целочисленный восьмиричный литерал следующим образом
OctalIntegerLiteral ::
0o OctalDigits
0O OctalDigits
OctalDigits ::
OctalDigit
OctalDigits OctalDigit
OctalDigit :: one of
0 1 2 3 4 5 6 7
Как можно видеть, литералы, начинающиеся с цифры 0, за которой следует буква строчная o или заглавная O, являются целочисленными восьмиричными литералами.
Проблема в том, что, например, мне не удалось использовать этот литерал в IE 11 независимо от выбранного режима ("USE STRICT").:) В то время как в FireFox 42 данный литерал успешно обрабатывается.
Также в JavaScript определяется так называемый LegacyOctalIntegerLiteral
LegacyOctalIntegerLiteral ::
0 OctalDigit
LegacyOctalIntegerLiteral OctalDigit
В вашем случае используется именно этот литерал.
В спецификации EcmaScript (6 редакция) есть замечание, что
A conforming implementation, when processing strict mode code (see 10.2.1), must not extend, as described in B.1.1, the syntax of NumericLiteral to include LegacyOctalIntegerLiteral, nor extend the syntax of DecimalIntegerLiteral to include NonOctalDecimalIntegerLiteral.
Однако, как обычно, каждый браузер идет своим путем.:)
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости