Почему числовые литералы Octal не разрешены в строгом режиме JavaScript? В чем вред?

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

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

16
Zameer Ansari 18 Дек 2015 в 17:55

4 ответа

Лучший ответ

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

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

"use strict";
var x = parseInt('010', 8);
document.write(x);
12
Amit 18 Дек 2015 в 14:58

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

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

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

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

5
gsnedders 18 Дек 2015 в 15:06

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

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

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

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

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);
13
Patrick Roberts 18 Окт 2018 в 03:31

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

const NINE = 0o11; // octal
const TEN = 0b1010; // binary
const SEVENTEEN = 0x11; // hexa
7
Willian Balmant 20 Дек 2017 в 01:19