Переменные и типы
const/let, примитивные типы, === и полезные операторы.
Обновлено
Что такое переменная
Переменная — это имя, которое вы связываете со значением, чтобы использовать его позже. Представьте ярлык, наклеенный на коробку:
const price = 100 // ярлык «price» → значение 100
const total = price * 2 // используете ярлык вместо значенияБез переменных пришлось бы повторять значения повсюду, и нельзя было бы работать с меняющимися данными (ввод пользователя, ответы сервера).
У переменной есть три вещи: имя, значение и область видимости (часть кода, где она видна).
Три способа объявления
const |
let |
var |
|
|---|---|---|---|
| Можно переприсвоить | нет | да | да |
| Область видимости | блок { } |
блок { } |
вся функция |
| Hoisting | да, но в TDZ | да, но в TDZ | да, со значением undefined |
| Повторное объявление в той же области | ошибка | ошибка | можно (опасно) |
| Когда использовать | по умолчанию, почти всегда | когда значение действительно меняется (счётчик, аккумулятор) | никогда в новом коде |
const name = 'Ana'
name = 'Ivan' // ✗ TypeError: Assignment to constant variable
let count = 0
count = count + 1 // ✓
if (true) {
let inside = 1
var leaks = 2
}
inside // ✗ ReferenceError — let живёт только в блоке
leaks // 2 — var «утекает» из блокаconst не значит «неизменяемый». Он фиксирует только связь имя → значение. Если значение — объект или массив, его содержимое может меняться:
const user = { name: 'Ana' }
user.name = 'Ivan' // ✓ работает — меняется объект, а не связь
user = {} // ✗ — попытка изменить связь(Подробнее — в уроке Ссылки и иммутабельность.)
Что такое тип
У каждого значения есть тип — что это за данные и что с ними можно делать. JS — язык с динамической типизацией: тип есть не у переменной, а у значения. Одна и та же переменная let может хранить сначала число, потом строку.
Примитивные типы
Примитивы — простые неизменяемые значения, копируются по значению.
| Тип | Примеры | Для |
|---|---|---|
string |
'Ana', "text", `Hello ${name}` |
текста |
number |
42, 3.14, -1, NaN, Infinity |
любых чисел (один тип для целых и дробных) |
boolean |
true, false |
да / нет |
undefined |
undefined |
«значения пока нет» — ставит JS |
null |
null |
«пусто намеренно» — ставите вы |
bigint |
9007199254740993n |
очень больших целых |
symbol |
Symbol('id') |
уникальных ключей (в приложениях редко) |
Объекты
Всё, что не примитив, — object: объекты {}, массивы [], функции, Date, Map… Объекты копируются по ссылке.
null или undefined
undefined |
null |
|
|---|---|---|
| Кто ставит | JS, автоматически | вы, явно |
| Означает | неинициализированная переменная, отсутствующее свойство, функция без return |
«здесь ничего нет, намеренно» |
typeof |
'undefined' |
'object' (историческая ошибка) |
Проверка типа
typeof 'a' // 'string'
typeof 42 // 'number'
typeof undefined // 'undefined'
typeof null // 'object' ← ловушка
typeof [] // 'object' ← ловушка
typeof (() => {}) // 'function'
Array.isArray([]) // true ← так проверяют массив
x === null // так проверяют null== или ===
=== (строгое) |
== (нестрогое) |
|
|---|---|---|
| Преобразует типы | нет | да, по правилам, которые трудно запомнить |
0 === '' |
false |
0 == '' → true 😬 |
| Когда | всегда | практически никогда |
Truthy и falsy
В if, &&, || любое значение приводится к boolean. Falsy-значений всего 6: false, 0, '', null, undefined, NaN. Всё остальное — truthy, включая '0', [] и {}.
Операторы для отсутствующих значений
| Оператор | Берёт значение справа, когда слева... | Пример |
|---|---|---|
|| |
любое falsy (включая 0, '') |
name || 'Аноним' |
?? |
только null / undefined |
limit ?? 10 — сохраняет 0 |
?. |
— обращается, только если существует | user?.address?.city |
Правило: для значений по умолчанию используйте ??, а не || — иначе 0 и '' станут «отсутствующими».
Шаблонные строки
const msg = `Привет, ${name}! У вас ${count} сообщ.`Обратные кавычки, выражения внутри ${}, можно писать в несколько строк.
Коротко
- Переменная = имя, связанное со значением;
constпо умолчанию,let— когда меняется,var— никогда. - 7 примитивных типов (копируются по значению) + объекты (копируются по ссылке).
- Всегда
===;??для значений по умолчанию;?.для безопасного доступа.