Кратко
Скопированоconst
— ключевое слово языка для объявления констант. Константа — переменная, значение которой нельзя переназначить.
Пример
Скопированоconst DAYS_IN_YEAR = 365
const DAYS_IN_YEAR = 365
Как понять
СкопированоКонстанты — те же переменные. Единственная разница в том, что их нельзя переопределить.
Если попробовать это сделать, то код упадёт с ошибкой TypeError
:
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 // ошибка, константы нельзя переопределять
☝️ Если константа хранит массив или объект, то сам массив/объект изменять можно! Нельзя заменить один объект на другой. Это происходит из-за того, что константа хранит ссылку на сложное значение, а не само значение.
Например, мы можем добавить новый объект в массив, но при попытке записать в переменную 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
формат именования, если нужно объявить константу, которая хранит важное значение для программы: количество элементов на странице по умолчанию, формат даты, максимальное количество заказов и т.д.
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
обычно присваивается переменной, когда она была объявлена, но не было определено её начальное значение. Также, undefined
может возвращаться и из функции — это происходит, если функции явно не возвращает ничего другого. null
же обычно возвращают из функции явно, чтобы показать, что результат функции равен «ничему».
Без начального значения можно оставлять только переменную объявленную через let
или var
. Если объявить переменную через const
и не задать ей начального значения, будет ошибка: Uncaught SyntaxError
.
Оператор typeof
для null
работает странно. typeof
выдаст нам строку 'object'. Это официально признанная ошибка в языке, сохраняемая для совместимости. Ошибка тут в том, что null
это отдельный тип данных, а не объект. С undefined
всё куда лучше и typeof
выдаст нам 'undefined'. Почитать ещё о typeof
можно здесь.
Поговорим немного о приведении типов. Для начала, пример:
console.log(null + null); // 0console.log(undefined + undefined); // NaN
console.log(null + null); // 0 console.log(undefined + undefined); // NaN
Почему так?
null
во время сложения приводится к нулю. Это логично, так как числовым значением «ничего» является как раз 0.
С undefined
другое поведении, так как JavaScript пытается привести его к числу, но у него не получается и в результате мы получаем NaN
.
Немного упомяну и про оператор нулевого слияния (?
). В выражении между двумя операндами, он будет возвращать первый операнд, если он не равен null
или undefined
. Можно сказать, что ?
приравнивает смысл undefined
и null
к «ничего не содержит» и в этом случае, кладёт в переменную значение второго операнда.