Переменные и типы данных

Переменные и типы данных в JavaScript #

Переменная — именованная привязка к значению: через имя можно читать данные и записывать новые (если объявление это допускает). В JavaScript у каждого значения есть тип; сама переменная не «закрепляет» тип навсегда — в let можно положить другое значение позже.


Как объявить переменную #

Современный JavaScript поддерживает три способа объявления:

let cartTotal = 0
const playlistId = 'focus-tracks'
var legacyCounter = 1 // устаревший способ

var — устаревший, может быть переобъявлен в той же области видимости.
let и const — блочные привязки: область видимости ограничена блоком { ... }.
let допускает повторное присваивание, const — нет (но мутабельные объекты и массивы можно изменять по содержимому).

cartTotal = cartTotal + 490
// playlistId = 'other' — TypeError: Assignment to constant variable

Блочная область видимости и TDZ #

let и const видны только внутри блока, где объявлены. Вне блока обращение к имени даёт ReferenceError, даже если переменная с тем же именем есть выше по коду.

const sessionId = 'sess-9f2'

{
  let retryCount = 0
  retryCount++
}

// retryCount — ReferenceError вне блока

Temporal Dead Zone (TDZ) — участок кода от входа в блок до строки объявления: имя уже зарезервировано, но читать или писать в него нельзя.

console.log(score) // ReferenceError
let score = 95

const попадает в TDZ так же, как let. Отличие в том, что после инициализации нельзя переназначить саму привязку:

const cart = []
cart.push({ sku: 'kb-01', qty: 1 }) // допустимо
// cart = [] — TypeError

var, напротив, «поднимается» (hoisting) на уровень функции или скрипта и до присваивания имеет значение undefined, а не попадает в TDZ.


Типы данных в JS #

В JS существует 8 типов данных:

ТипПримерОписание
numberlet total = 1490Числа, включая NaN и Infinity
bigint9876543210nОчень большие целые числа
string"checkout"Текст в кавычках
booleanisPaid / falseИстина или ложь
nullnullНамеренное отсутствие значения
undefinedlet pendingTrack;Переменная объявлена, но не присвоена
symbolSymbol("playlist")Уникальный идентификатор
object{ trackId: 42 }Коллекция данных

Почти всё в JavaScript — объект: массивы, функции, даже Math.


typeof #

Чтобы узнать тип значения, используется оператор typeof:

typeof 'checkout' // "string"
typeof cartTotal // "number"
typeof isPaid // "boolean"
typeof null // "object" — исторический баг
typeof { trackId: 7 } // "object"
typeof Array.isArray // "function"

typeof возвращает строку; для null исторически возвращается "object", поэтому для точной проверки на null сравнивайте значение напрямую: value === null.


См. также #


Итог #

  • Переменные хранят данные под именем.
  • Объявляйте новый код через let или const; var оставьте для чтения legacy.
  • let и const ограничены блоком; до объявления действует TDZ.
  • В JS восемь типов данных.
  • typeof помогает проверить тип, но null им не различается точно.

Часто спрашивают

Чем let отличается от const?
Оба блочные. let допускает повторное присваивание, const — нет (содержимое объекта при этом можно менять). Подробнее
Зачем нужен use strict?
Строгий режим ловит случайные глобалы и делает this у «голых» вызовов равным undefined; в ES-модулях он включён по умолчанию. Подробнее
Почему лучше писать ===, а не ==?
=== не приводит типы молча; == запускает сложные правила приведения и чаще даёт неожиданный результат. Подробнее