Почему Восьмеричные числовые литералы не допускаются в строгом режиме (и каков обходной путь?)
Почему Восьмеричные числовые литералы не допускаются в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 ответа:
Часть вопроса "почему" на самом деле не отвечает.
Что касается "как", то с моей головы слетело...
"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 все еще работает в строгом режиме.