Почему числовые литералы Octal не допускаются в строгом режиме (и как это обойти?)
Почему числовые литералы 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 (который может по ошибке изменить значение чисел), есть ли обходной путь?
7 ответов
Часть вопроса "почему" на самом деле не отвечает.
Что касается "как", от макушки головы...
"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);
Кажется достаточно безопасным, верно? Мы, программисты с 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);
В настоящее время, с большой поддержкой браузера ES6, вы можете написать это:
const NINE = 0o11; // octal
const TEN = 0b1010; // binary
const SEVENTEEN = 0x11; // hexa
Почему октальные числовые литералы не допускаются в строгом режиме javascript? В чем вред?
Восьмеричные в JS исторически были нестандартным расширением к стандарту (в ES5, который вводит строгий режим, они находятся в Приложении B, которое представляет собой набор нестандартных функций, поддерживаемых большинством реализаций: за исключением того, что он определяет восьмеричные в способ несовместим с тем, что требуют сайты), а в строгом режиме предпринята попытка запретить все нестандартные расширения. "Почему" относительно того, почему они никогда не были стандартизированы, является очевидным вопросом, о котором я не знаю.
В случае, если разработчику необходимо использовать Octals (что может по ошибке изменить значение числа), есть ли обходной путь?
Как ответил @Amit, parseInt
со вторым аргументом 8 все еще работает в строгом режиме.
в основном, когда я пытался использовать этот формат date = new Date(2021,09,07) в ответ и передать другому компоненту, чтобы я мог преобразовать в ISOString() или toLocaleString(), // {props.toISOString()}. Я получал эту ошибку «Устаревшие восьмеричные литералы не разрешены в строгом режиме»
НО, после удаления этих «нулей» перед месяцем и днем измените его на дату = новую дату (2021,9,7), у меня это работает совершенно нормально.
если вы применяете строгий режим поверх своего кода, вам нужно поместить его в этот формат
"use strict";
var x = '010';
console.log(x);
Возможно, вы используете неправильные строковые литералы ('') для JSON в "строгом режиме" в JS.
Правильно: {"name": "Джош"}
Неправильно: {'name': 'Josh'}