Мускулистая рука с татуировками, которая показывает козу
Иллюстрация: Кира Кустова

const

Создаём переменную, значение которой нельзя изменить.

Время чтения: меньше 5 мин

Кратко

Скопировано

const — ключевое слово языка для объявления констант. Константа — переменная, значение которой нельзя переназначить.

Пример

Скопировано
        
          
          const DAYS_IN_YEAR = 365
          const DAYS_IN_YEAR = 365

        
        
          
        
      

Как понять

Скопировано

Константы — те же переменные. Единственная разница в том, что их нельзя переопределить.

Если попробовать это сделать, то код упадёт с ошибкой TypeError: invalid assignment to const:

        
          
          const DAYS_IN_YEAR = 365console.log(DAYS_IN_YEAR)DAYS_IN_YEAR = 600// ошибка, константы нельзя переопределять
          const DAYS_IN_YEAR = 365

console.log(DAYS_IN_YEAR)

DAYS_IN_YEAR = 600
// ошибка, константы нельзя переопределять

        
        
          
        
      
ошибка TypeError в консоли

☝️ Если константа хранит массив или объект, то сам массив/объект изменять можно! Нельзя заменить один объект на другой. Это происходит из-за того, что константа хранит ссылку на сложное значение, а не само значение.

Например, мы можем добавить новый объект в массив, но при попытке записать в переменную series пустой массив произойдёт ошибка:

        
          
          const series = ['Доктор Хаус', 'Клиника', 'Чёрное зеркало']series.push('Молодой папа')series = [] // 🙅‍♂️ не можем _заменить_ один массив на другой
          const series = ['Доктор Хаус', 'Клиника', 'Чёрное зеркало']
series.push('Молодой папа')
series = [] // 🙅‍♂️ не можем _заменить_ один массив на другой

        
        
          
        
      

Та же история с объектами:

        
          
          const person = { name: 'X Æ A-12', lastName: 'Musk' }person.age = 0person = { name: 'Педро' } // 🙅‍♀️ не можем заменить на новый объект
          const person = { name: 'X Æ A-12', lastName: 'Musk' }
person.age = 0
person = { name: 'Педро' } // 🙅‍♀️ не можем заменить на новый объект

        
        
          
        
      

Зачем нужны константы?

Скопировано

Константы защищают код от случайной перезаписи важных значений.

Применяют константы в двух случаях:

  • мы хотим объявить переменную, которая хранит фундаментальное значение для программы. Например, количество дней в году, минимальную сумму заказа, форматы дат и так далее.
  • мы объявляем переменную и устанавливаем ей значение всего один раз.

Как пишется

Скопировано

Константы объявляются так же, как и переменные:

        
          
          const name = value
          const name = value

        
        
          
        
      

name Имя константы. Может использоваться любой допустимый идентификатор.

value Значение константы. Любое допустимое выражение.

На практике

Скопировано

Николай Лопин советует

Скопировано

Константы в современном JS используют чаще, чем переменные. В большинстве случаев, значение переменной устанавливается только один раз. Хорошей практикой считается объявлять такие переменные через const и писать название переменной в camelCase, чтобы подчеркнуть этот факт:

        
          
          for (let i = 0; i < users.length; ++i) {  const user = users[i]  printUserInfo(user)}
          for (let i = 0; i < users.length; ++i) {
  const user = users[i]
  printUserInfo(user)
}

        
        
          
        
      

Используй ALL_CAPS формат именования, если нужно объявить константу, которая хранит важное значение для программы: количество элементов на странице по умолчанию, формат даты, максимальное количество заказов и т.д.

        
          
          const ITEMS_PER_PAGE = 25for (let i = 0; i < products.length && i < ITEMS_PER_PAGE; i++) {  printItem(products[i])}
          const ITEMS_PER_PAGE = 25

for (let i = 0; i < products.length && i < ITEMS_PER_PAGE; i++) {
  printItem(products[i])
}

        
        
          
        
      

На собеседовании

Скопировано
Задать вопрос в рубрику
🤚 Я знаю ответ

Скопировано

null задаётся переменной явно и означает, что она является объектом, но структура этого объекта ещё не определена. undefined присваивается переменной (переменная не декларирует объект), когда она была объявлена, но не было определено её начальное значение. Функция может возвращать undefined или null. Всё зависит от того, что мы ожидаем в результате работы функции. Если мы ожидаем объект, но по каким-то причинам функция его вернуть не может, то возвращаем null. Если функция должна вернуть, например, число (главное, не объект), но не может этого сделать, то она возвращает undefined.

Без начального значения можно оставлять только переменную, объявленную через let или var. Если объявить переменную через const и не задать ей начального значения, будет ошибка: Uncaught SyntaxError: Missing initializer in const declaration.

Поговорим немного о приведении типов. Для начала, пример:

        
          
          console.log(null + null); // 0console.log(undefined + undefined); // NaN
          console.log(null + null); // 0
console.log(undefined + undefined); // NaN

        
        
          
        
      

Почему так?

По спецификации EcmaScript

  • null во время сложения приводится к нулю;
  • undefined во время сложения приводится к NaN. NaN это аббревиатура от "not a number" — не число. Результат арифметической операции равен NaN, если во время операции произошла ошибка и ожидаемый числовой результат не может быть выражен числом.

Есть ещё один хитрый пример:

        
          
          console.log(null + []); // "null"
          console.log(null + []); // "null"

        
        
          
        
      

Почему так?

Подсказка, почему так, кроется именно в типе результате: "null" — строка. А не примитивное значение null.

JavaScript сначала приводит массив к примитивному значению. Для этого вызывается метод toString(), который вызывает метод join(). Т.к. массив пустой, то join() вернёт пустую строку "". А сложение чего-то со строкой в JS возвращает строку. Поэтому null уже никуда не приводится, а возращается строка "null".

Немного упомяну и про оператор нулевого слияния (??). В выражении между двумя операндами он будет возвращать первый операнд, если он не равен null или undefined. Можно сказать, что ?? приравнивает смысл undefined и null к «ничего не содержит», и, в этом случае, кладёт в переменную значение второго операнда.