Недавно я написал много кода ES6 для io.js. В дикой природе не так уж много полезного, поэтому я чувствую, что по ходу дела определяю свои собственные соглашения.
Мой вопрос о том, когда использовать const
против let
.
Я применяю это правило: если возможно, используйте const
. Используйте только let
если вы знаете, что его значение необходимо изменить. (Вы всегда можете вернуться и изменить a const
на a, let
если позже выяснится, что вам нужно изменить его значение.)
Основная причина этого правила - его легко применять последовательно. Там нет серых зон.
Дело в том, что когда я применяю это правило, на практике это 95% моих заявлений const
. И это выглядит странно для меня. Я использую только let
для таких вещей, как i
в for
цикле, или иногда для таких вещей, как накопленные итоги Фибоначчи (что не так уж и много в реальной жизни). Я был удивлен этим - оказывается, 95% «переменных» в моем коде ES5 на сегодняшний день были для значений, которые не меняются. Но, видя const
весь мой код, я чувствую что-то не так.
Итак, мой вопрос: нормально ли это использовать const
? Должен ли я действительно делать такие вещи, как const foo = function () {...};
?
Или я должен зарезервировать const
для тех ситуаций, когда вы жестко кодируете литерал в верхней части модуля - как вы делаете в полных заглавных буквах, как const MARGIN_WIDTH = 410;
?
источник
const
это много.function foo() {...}
лучше, чем<anything> foo = function() {...}
function foo() {...}
может вызвать незначительную путаницу при отладке из-за подъема. Кроме того, его существование означает, что у нас есть две конструкции, которые делают одно и то же, но одна из них работает только в очень специфическом контексте. (Вы можете использовать выражение функции везде, где может существовать выражение, но вы можете использовать только объявление функции на уровне оператора.) Если вы предпочитаете краткость, проблема может заключаться просто в том, что синтаксис выражения функции использует целое словоfunction
.Ответы:
Мой ответ здесь не зависит от javascript.
Как правило, на любом языке, который позволяет мне делать это в полулегком виде, я бы сказал, всегда используйте const / final / readonly / независимо от того, как это называется в вашем языке, когда это возможно. Причина проста, гораздо проще рассуждать о коде, когда он абсолютно очевиден, что может измениться, а что нет. И в дополнение к этому, во многих языках вы можете получить поддержку инструментов, которая говорит вам, что вы делаете что-то неправильно, когда вы случайно назначаете переменную, которую вы объявили как const.
Вернуться назад и изменить const на let очень просто. И если по умолчанию использовать const, вам придется дважды подумать, прежде чем делать это. И это во многих случаях хорошо.
Сколько ошибок вы видели, что переменные неожиданно изменились? Я бы многое угадал. Я знаю, что большинство ошибок, которые я вижу, связано с неожиданными изменениями состояния. Вы не избавитесь от всех этих ошибок, свободно используя const, но вы избавитесь от многих из них!
Кроме того, многие функциональные языки имеют неизменяемые переменные, где все переменные по умолчанию постоянны. Посмотрите на Эрланга, например, или F #. Кодирование без присваивания прекрасно работает на этих языках и является одной из многих причин, почему люди любят функциональное программирование. Из этих языков можно многому научиться в управлении состоянием, чтобы стать лучшим программистом.
И все начинается с того, чтобы быть чрезвычайно либеральным с const! ;) Это всего лишь два символа, которые нужно написать, по сравнению с let, так что давай, и
const
все!источник
const
на два персонажа больше, чемlet
...val
в Scala (которая объявляет переменную неизменной) и использование толькоvar
(изменяемый эквивалент), когда мы не можем использоватьval
. Другими словами, мы объявляем переменные как неизменяемые по умолчанию и вводим изменчивость только тогда, когда она нам абсолютно необходима (что может быть просто потому, что изменяемый подход чище).Будьте осторожны, потому что
const
ключи объектов изменчивы.Отсюда: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
рассмотрим этот пример:
То же самое для массивов:
Я не решил полностью сам, но я рассматриваю использование
const
для всех не массивов / не-объектов и использованиеlet
для объектов / массивов.источник
const
.colors = numbers
не будет работать, как ожидалось. Если вы хотите защитить свои свойства объекта, вы можете использоватьObject.freeze()
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…const moment = require('moment')
, если только вы не тот человек, который беспокоится о том, что кто-то попытается сделатьmoment = dead.fish(() => pizza)
позже.moment = Date.now()
. Но в любом случае, если код принимает инвариант, я не вижу ничего плохого в его применении, где это возможно.Не беспокойся об этом.
const
это удивительное дополнение к JavaScript, и я бы порекомендовал вам использовать его везде, где это имеет смысл. Это делает для более надежного кода.Когда дело доходит до объектов,
const
защитит вашу переменную от переназначения, но если вам нужны неизменяемые объекты, вам понадобитсяObject.freeze
метод, см. Ниже.const
будет защищать только от переназначения, аfreeze
метод будет защищать все непосредственные свойства. Если вам нужно, чтобы все вложенные свойства также были неизменяемыми, то вам нужно будет рекурсивноfreeze
их использовать.источник
Object.freeze
это мелко.В моем ES6 речь
const
идет не об неизменяемости поста, я объясняю, чтоconst
значит именно по спецификации.Исходя из этих объективных фактов, вот мое личное предпочтение:
Как бы субъективно это ни было, факт, что это наиболее точно соответствует цели спецификации.
Люди, которые используют
let
по умолчанию, обычно рассматриваютconst
переменные как константы (а это не обязательно, по замыслу!). Каждому свое, но я предпочитаю использовать вещи по прямому назначению, а не для какого-то придуманного значения, которое люди присваивают ему по недоразумению.Использование
const
только для констант похоже на использование элемента HTML<aside>
только для содержимого боковой панели.источник
const
если оно не является постоянным?const
, для чего. Вы читали выше?const
том, что это называетсяconst
. Это глупое имя (в javascript), которое поначалу смущает многих (всех?) Разработчиков. ИМО лучше было бы, еслиconst
бы ему позвонилиlet
(особенно потому, чтоlet
он короче, ноconst
гораздо чаще) иlet
назвали бы что-то еще.Мой личный подход, помогающий читаемости и пониманию кода:
let
только для кратковременных переменных, определенных в одной строке и не изменяемых после. Как правило, те переменные, которые есть только для уменьшения количества набрав. Например:const
для всех имен, которые известны постоянными во всем модуле. Не включая локально постоянные значения.value
В приведенном выше примере, например, постоянно в объеме и может быть объявлено сconst
, но так как есть много итераций и для каждого из них есть значение с таким же названием , «значение», которые могли бы обмануть читатель в мышленииvalue
всегда тот же самый. Модули и функции являются лучшим примеромconst
переменных:var
за все, что может или не может быть переменной. Имена, которые могут запутать людей, читающих код, даже если они являются локальными константами и не подходят дляlet
(т. Е. Они не заполнены в простой прямой декларации), применяются для объявления с помощьюvar
. Например:Дальнейшие комментарии и возможные будущие обновления здесь .
источник
JavaScript немного особенный в том смысле, что переменные могут быть функциями и тому подобное, но рассмотрим в C #, Java или другом подобном языке стиля C:
Это
const
странно, и это потому, что объявления методов в этих языках не могут измениться, как только они скомпилированы во что-то другое, это то, что они делают, несмотря ни на что (игнорируя некоторые ужасные хаки, которые могут существовать).Почему JavaScript должен быть другим? Так что он не скомпилирован, но это не значит, что мы должны отбросить безопасность, которую могут обеспечить компиляторы. Использование
const
ключевого слова дает нам больше безопасности, что, безусловно, приведет к более надежным приложениям.источник