Странное восьмеричное поведение

Насколько я понимаю, восьмеричные литералы (формы 023) недействительны в ECMAScript 5, но широко поддерживаются. В ECMAScript 6 они теперь поддерживаются в формате 0o23 или 0O23. Что меня смущает, так это поведение чисел, которые не являются допустимыми восьмеричными числами, но имеют предшествующий ноль (019). Кажется, что они ведут себя как обычные десятичные числа.

Таким образом, без строгого режима я могу получить такие вещи, как 022 === 018 (true), потому что 022 интерпретируется как восьмеричное, а 018, по-видимому, обрабатывается как десятичное, поскольку оно не может быть восьмеричным.

В строгом режиме я получаю сообщение об ошибке при использовании действительного восьмеричного числа в этом формате (например, 022), но не при использовании числа с нулевым префиксом, которое не может быть допустимым восьмеричным числом (например, 018).

Мне это кажется очень странным, так как JS (строгий режим) говорит мне, что я могу поставить 0 перед своим числом, если оно является НЕДЕЙСТВИТЕЛЬНЫМ восьмеричным числом. Будут ли в ES6 (или более поздних версиях) числа с нулевым префиксом (возможные восьмеричные или иные) недействительными или рассматриваться как десятичные?


person boxtrain    schedule 21.11.2016    source источник


Ответы (1)


Это задокументированная функция:

Десятичные литералы могут начинаться с нуля (0), за которым следует другая десятичная цифра, но если все цифры после начального 0 меньше 8, число интерпретируется как восьмеричное. Это не вызовет JavaScript.

Если вы хотите принудительно обрабатывать число как восьмеричное, вы можете использовать новую литеральную форму 0o (или 0O), представленную в ES6.

person hindmost    schedule 21.11.2016