
Многие руководства по стилю JavaScript предлагают использовать имена констант с заглавной буквы. Лично я редко вижу, чтобы это соглашение использовалось там, где я думал, что это должно быть. Это произошло потому, что мое определение константы было немного неправильным. Я решил немного покопаться и поближе познакомиться с этим соглашением.
Как мы определяем термин «постоянный»?
В программировании константа - это то, что не меняется.
Это значение, которое программа не может изменить во время нормального выполнения.
Итак, дает ли JavaScript нам возможность объявить значение, которое нельзя изменить? Прежде чем ответить на этот вопрос, давайте посмотрим на корни этого соглашения.
Соглашение о капитализации имеет корни в C
C - это компилируемый язык. Это означает, что другая программа перед запуском преобразует весь ваш код в машинный код.
С другой стороны, JavaScript - это интерпретируемый язык. Интерпретатор читает ваш код построчно по мере его выполнения.
Разница между компиляцией и интерпретацией играет роль в том, как мы объявляем постоянные значения в C.
В C я могу объявить такую переменную:
int hoursInDay = 24;
Или такая константа:
#define hoursInDay 24
Второй пример называется символьной константой. Символьные константы могут быть последовательностью символов, числовой константой или строкой. Их также называют примитивными значениями. Примитивные значения в JavaScript - это строки, числа, логические значения, null, undefined, символ (не путать с символьными константами) и большой int.
А теперь вернемся к компиляции.
Перед компиляцией проходит этап предварительной компиляции. Здесь предварительный компилятор заменяет все экземпляры символьных констант соответствующим значением. Компилятор никогда не знает, что программист написал hoursInDay. Он видит только число 24.
Использование заглавных букв помогает программисту увидеть эти действительно постоянные значения.
#define HOURS_IN_DAY 24
Константы JavaScript отличаются от символьных констант
До ES6 мы хранили большинство значений в переменных, даже те значения, которые вы хотели оставить постоянными.
Использование заглавных букв помогло нам увидеть ценности, которые мы хотели сохранить неизменными.
var HOURS_IN_DAY = 24; var hoursRemaining = currentHour - HOURS_IN_DAY; var MY_NAME = 'Brandon'; MY_NAME = ... // oops don't want to do this.
ES6 представил объявление const , которое не является «константой» в чистом смысле слова.
ES6 добавил термины const и let как способы создания переменных с разными намерениями.
С этими двумя терминами вы можете подумать, что мы либо:
- не нужно ничего писать с заглавной буквы, так как мы можем ясно видеть, какие переменные должны оставаться неизменными, или
- мы должны использовать заглавные буквы во всем, что мы объявляем с помощью
const.
По определению const создает константу, которая является доступной только для чтения ссылкой на значение. Это не означает, что его значение неизменяемо. Там только сказано, что идентификатор переменной нельзя переназначить.
Другими словами, некоторые const ссылки могут измениться.
const firstPerson = {
favoriteNumber: 10,
};
const secondPerson = firstPerson;
console.log(secondPerson.favoriteNumber); //10
firstPerson.favoriteNumber +=1;
console.log(secondPerson.favoriteNumber); //11
В приведенном выше примере показано, что объявление const не гарантирует неизменяемость переменной.
const только мешает нам переназначить имя переменной. Это не останавливает изменение свойства объекта. Помните: объекты передаются по ссылке.
// "TypeError: Assignment to constant variable."secondPerson = 'something else'; const secondPerson = 'Me' secondPerson = 'something else';
Итак, для JavaScript мы должны выйти за рамки простого поиска const объявления. Нам нужно задать два вопроса, чтобы определить, является ли переменная константой:
- Является ли значение переменной примитивным?
- Намерены ли мы, чтобы имя переменной указывало на одно и то же значение в нашей программе?
Если ответ положительный для обоих, мы должны объявить переменную с const и использовать имя с заглавной буквы.
Обратите внимание, я сказал может. Дух этого соглашения исходит из разных языков, в которых были настоящие константы. JavaScript этого не делает. По крайней мере, в самом чистом смысле. Возможно, поэтому вы видите это соглашение реже, чем можно было бы ожидать. У Airbnb есть отличный раздел в своем руководстве по стилю с их мнением здесь.
Ключевой вывод - признать, что определение константы в JavaScript должно учитывать намерения программиста.
Кроме того, не все соглашения одного языка имеют смысл на другом языке. Наконец, я могу только представить, что многие соглашения использовались задолго до того, как у IDE появились возможности, которыми они обладают сегодня. Я убежден, что моей среде IDE доставляет удовольствие говорить мне, что я ошибаюсь. Бывает много.
Спасибо за прочтение!
воз
Подпишись на меня в Твиттере."
Примечания
- Вы можете спросить, почему я не использовал
PIни в одном из этих примеров. Акронимы, особенно двухбуквенные, обычно пишутся с заглавной или строчной буквы.