Почему Восьмеричные числовые литералы не допускаются в строгом режиме (и каков обходной путь?)


Почему Восьмеричные числовые литералы не допускаются вJavaScript strict mode ? В чем же тут вред?

"use strict";
var x = 010; //Uncaught SyntaxError: Octal literals are not allowed in strict mode.
<h1>Check browser console for errors</h1>

В случае, если разработчику необходимо использовать Окталы (которые могут ошибочно изменить значение чисел), Есть ли обходной путь?

4 9

4 ответа:

Часть вопроса "почему" на самом деле не отвечает.

Что касается "как", то с моей головы слетело...

"use strict";
var x = parseInt('010', 8);
document.write(x);

Восьмеричные литералы не допускаются, поскольку их запрещение не позволяет программистам использовать начальные нули в качестве дополнения в сценарии. Например, рассмотрим следующий фрагмент кода:

var eight = 0008,
    nine = 00009,
    ten = 000010,
    eleven = 011;

console.log(eight, nine, ten, eleven);

Кажется достаточно безобидным, не так ли? Мы, программисты с ОКР, просто хотим выровнять все запятые вместе, чтобы это выглядело лучше. Но вот в чем проблема:

8 9 8 9

Это и есть выход. Видите, как это становится непоследовательно? Не все нуль-дополненные числовые литералы преобразуются в восьмеричные, так как 8 и 9 не являются восьмеричными числами. Труднее поддерживать их согласованность, когда приходится помнить все эти правила, поэтому strict mode облегчает это, полностью отвергая его.

Вместо этого вы должны прокладывать с ведущими пробелами, или если вы хотите использовать восьмеричный, то используйте parseInt() с необязательным аргументом radix 8 для указания восьмеричного числа.

Вот два" решения", соответственно:

"use strict";

var eight  =  8,
    nine   =  9,
    ten    = 10,
    eleven = 11;

console.log(eight, nine, ten, eleven);

"use strict";

var eight  = parseInt('010', 8),
    nine   = parseInt('011', 8),
    ten    = parseInt('012', 8),
    eleven = parseInt('013', 8);

console.log(eight, nine, ten, eleven);

Почему Восьмеричные числовые литералы не допускаются в строгом режиме javascript? Что в этом плохого?

Octals в JS исторически были нестандартным расширением стандарта (в ES5, который вводит строгий режим, они находятся в приложении B, которое представляет собой набор нестандартных функций, которые поддерживает большинство реализаций: за исключением того, что он определяет окталы способом, несовместимым с тем, что требуется веб-сайтам), и строгий режим сделал попытку запретить все нестандартные расширения. "Почему" как к тому, почему они никогда не были стандартизированы, очевидно, относится вопрос, о котором я не знаю.

В случае, если разработчику нужно использовать Окталы (которые могут ошибочно изменить значение числа), есть ли обходной путь?

Как ответил @Amit, parseInt со своим вторым аргументом как 8 все еще работает в строгом режиме.

В настоящее время, с большой поддержкой браузера ES6, вы можете написать следующее:

const NINE = 0o11; // octal
const TEN = 0b1010; // binary
const SEVENTEEN = 0x11; // hexa