Переменные и типы данных в 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 типов данных:
| Тип | Пример | Описание |
|---|---|---|
| number | let total = 1490 | Числа, включая NaN и Infinity |
| bigint | 9876543210n | Очень большие целые числа |
| string | "checkout" | Текст в кавычках |
| boolean | isPaid / false | Истина или ложь |
| null | null | Намеренное отсутствие значения |
| undefined | let pendingTrack; | Переменная объявлена, но не присвоена |
| symbol | Symbol("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им не различается точно.