let vs const vs var: Обычно, все что вам нужно, — это let. Если вам нужно запретить перезаписывание переменной, вы можете использовать const. (Некоторые очень педантичны по этому поводу и предпочитают использовать const, когда бывает только одно назначение переменной).
Это утверждение оказалось очень спорным, на Twitter'e и Reddit'e сразу же начались жаркие обсуждения по этому поводу. Похоже наиболее популярное мнение (или по крайней мере, устно высказанное большинством) это то, что следует всегда использовать const и обращаться к let только при необходимости, что может быть обеспечено ESLint правилом prefer-const.
В этом посте я коротко перечислю все за и против, которые я встретил, и выскажу свое личное мнение по этому поводу.
Почему предпочитают const
Четкое правило: Это лишняя нагрузка для мозга, когда вам приходится каждый раз думать, использовать const или же лучше будет let. Правило «Всегда используй const, где это работает» освобождает вас от лишней мороки и оставляет эту задачу для линтера.
Переназначения могут стать причиной багов: В больших функциях бывает так, что вы можете не заметить, если переменная переназначится, и это может оказаться причиной багов. Особенно в замыканиях. Const дает вам уверенность в том, что вы всегда будете видеть одно и то же значение.
Понимание мутации: Те, кто только начинает изучать JavaScript, могут неправильно понять принцип работы const, думая что он предотвращает мутацию переменной. Важно понять разницу между мутацией переменной и ее переназначением. Использование const принуждает вас понять и противостоять этому различию на ранней стадии.
Бессмысленные переназначения: Иногда переназначение переменной не имеет смысла вообще. Например, в React Hooks, значения, которые вы получаете из хука — как useState — больше похожи на параметры. Они идут в одном направлении. Видя ошибку при их назначении, вы раньше узнаете о потоке данных React'а.
Преимущества исполнения: Есть также редкие заявления о том, что движок JavaScript'а может быстрее исполнять код, где используется const, так как знает, что переменная не может быть перезаписана.
Почему не предпочитают const
Const теряет свой смысл: Если мы везде будем использовать const, мы потеряем способность понимать, было ли это важно, чтобы что-то не было переназначено.
Конфуз с иммутабельностью: В каждой дискуссии, где говорят, что нужно всегда использовать const, находятся те, кто путается в вопросе иммутабельности. Это неудивительно, так как обе операции (объявление и переназначение) используют один оператор "=". В ответ на это обычно говорят, что просто нужно «учить язык». Однако контраргументы таковы, что если метод, который должен предотвращать ошибки начинающих, приводит в замешательство этих самых начинающих, то это не так уж и полезно. И, к сожалению, это не помогает предотвращать ошибки мутации, которые распространяются на модули и влияют на все.
Давление во избежание переобъявления: Сторонники «const-firls» метода принуждают разработчиков не использовать let в переменных, объявленных в условии. Например, вы можете написать
const a = cond ? b : c
вместо if условия, даже если оба b и c ветки (объекты) сложные и давать им подробные имена затруднительно.
Переназначение не не может быть причиной багов: Есть три главные составляющие, когда переназначение может быть причиной багов: область видимости слишком большая (как модульная или большой функции), когда значение это параметр (так как не ожидается что это будет равно чему-то еще, кроме того, что было передано), и когда переменная использована во вложенной функции. Тем не менее, во многих ситуациях, большинство переменных не соответствуют ни одному из этих случаев, а параметры и вовсе не могут быть обозначены как константы.
Нет никакого преимущества исполнения: Это мое мнение, что движок уже бывает предупрежден — какие переменные объявлены один раз, даже если вы используете var или let. Если мы будем и дальше утверждать, что const делает код производительнее, то мы с таким же успехом можем утверждать и то, что дополнительные проверки могут увеличивать время исполнения, чем уменьшать его. Серьезно, движки же умнее.
Мое мнение
Мне все равно.
Я могу использовать любое правило которое используют другие.
Если вам не все равно, используйте линтер, который автоматизирует проверку и исправление, меняя let на const, так что это не потратит ваше время в дальнейшем ревью кода.
И последнее, помните, что линтеры созданы для облегчения разработки. Если какое либо правило докучает вам или вашей команде, просто уберите его. Это будет лучше всего. Учитесь на своих ошибках.