https://habr.com/ru/post/482892/Привет, Хабр! Представляю вашему вниманию перевод статьи
«On let vs const» автора
Дэна Абрамова.
Мой
предыдущий пост содержит такой параграф:
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-first» метода принуждают разработчиков не использовать let в переменных, объявленных в условии. Например, вы можете написать
const a = cond ? b : c
вместо if условия, даже если оба b и c ветки (объекты) сложные и давать им подробные имена затруднительно.
- Переназначение не не может быть причиной багов: Есть три главные составляющие, когда переназначение может быть причиной багов: область видимости слишком большая (как модульная или большой функции), когда значение это параметр (так как не ожидается что это будет равно чему-то еще, кроме того, что было передано), и когда переменная использована во вложенной функции. Тем не менее, во многих ситуациях, большинство переменных не соответствуют ни одному из этих случаев, а параметры и вовсе не могут быть обозначены как константы.
- Нет никакого преимущества исполнения: Это мое мнение, что движок уже бывает предупрежден — какие переменные объявлены один раз, даже если вы используете var или let. Если мы будем и дальше утверждать, что const делает код производительнее, то мы с таким же успехом можем утверждать и то, что дополнительные проверки могут увеличивать время исполнения, чем уменьшать его. Серьезно, движки же умнее.
Мое мнение
Мне все равно.
Я могу использовать любое правило которое используют другие.
Если вам не все равно, используйте линтер, который автоматизирует проверку и исправление, меняя
let на
const, так что это не потратит ваше время в дальнейшем ревью кода.
И последнее, помните, что линтеры созданы для облегчения разработки. Если какое либо правило докучает вам или вашей команде, просто уберите его. Это будет лучше всего. Учитесь на своих ошибках.
Ссылка на оригинал статьи —
On let vs const.