Семантика var
иlet
var
и let
это заявление для машины и других программистов:
Я намерен изменить значение этого задания в ходе исполнения. Не полагайтесь на возможную ценность этого назначения.
Последствия использования var
иlet
var
и let
заставлять других программистов читать весь промежуточный код из декларации для возможного использования, а также рассуждать о значении присваивания в тот момент выполнения программы.
Они ослабляют машинные рассуждения для ESLint и других языковых служб для правильного определения неверно введенных имен переменных в более поздних присваиваниях и повторного использования области имен переменных внешней области видимости, когда внутренняя область забывает декларировать.
Они также заставляют среды выполнения выполнять много итераций по всем кодовым путям, чтобы обнаружить, что они на самом деле являются константами, прежде чем они смогут их оптимизировать. Хотя это меньше проблем, чем обнаружение ошибок и понятность для разработчиков.
Когда использовать const
Если значение ссылки не изменяется ход выполнения, правильный синтаксис , чтобы выразить намерение состоит в том программист const
. Для объектов изменение значения ссылки означает указание на другой объект, поскольку ссылка неизменна, а объект - нет.
" const
" объекты
Для ссылок на объекты указатель не может быть изменен на другой объект, но объект, который создается и назначается const
объявлению, является изменяемым. Вы можете добавлять или удалять элементы из const
ссылочного массива, а также изменять ключи свойств для const
ссылочного объекта.
Чтобы достичь неизменных объектов (что опять же упрощает анализ вашего кода для людей и машин), вы можете Object.freeze
создать объект при объявлении / назначении / создании, например:
const Options = Object.freeze(['YES', 'NO'])
Object.freeze влияет на производительность, но ваш код, вероятно, работает медленно по другим причинам. Вы хотите профилировать это.
Вы также можете инкапсулировать изменяемый объект в конечный автомат и возвращать глубокие копии в качестве значений (так работают состояния Redux и React). Посмотрите Избежание изменяемого глобального состояния в Браузере JS для примера того, как построить это из первых принципов.
Когда var
и let
подойдем
let
и var
представляют изменяемое состояние. Они должны, на мой взгляд, использоваться только для моделирования фактического изменчивого состояния . Такие вещи, как « жива ли связь? ».
Они лучше всего инкапсулированы в тестируемых конечных автоматах, которые предоставляют постоянные значения, которые представляют « текущее состояние соединения », которое является константой в любой момент времени, и что на самом деле интересует остальная часть вашего кода.
Программирование уже достаточно сложное с составлением побочных эффектов и преобразованием данных. Превращение каждой функции в непроверяемый конечный автомат путем создания изменяемого состояния с переменными просто накапливает сложность.
Для более подробного объяснения см. Shun the Mutant - Дело заconst
.