Глиф Учебники

Урок 2. Переменные let и const, типы данных

Курс «JavaScript» · урок 2 из 10 · 4 минуты чтения

Переменная — именованное место для значения. Программа кладёт туда число, текст или что-то сложнее, а потом обращается к значению по имени. В современном JavaScript переменные объявляют словами let и const.

let и const

JavaScript
let age = 16;
const name = "Аня";

console.log(name, age);
age = 17;
console.log(name, age);
Вывод
Аня 16
Аня 17

Попытка изменить const — ошибка. Здесь она перехвачена конструкцией try … catch, чтобы программа не остановилась и вывела текст ошибки (подробнее о try — в уроке Асинхронность):

JavaScript
const pi = 3.14;

try {
  pi = 3;
} catch (err) {
  console.log(err.name + ": " + err.message);
}
Вывод
TypeError: Assignment to constant variable.
let — значение можно менять let age = 16; age 16 age = 17; age 16 17 новое значение — на место старого const — задаётся один раз const pi = 3.14; pi 3.14 pi = 3; TypeError: Assignment to constant variable.
В переменную let age можно записать новое значение — 17 встаёт на место 16, а const pi задаётся один раз: попытка pi = 3 даёт ошибку TypeError.

Какое слово выбрать? Правило простое: по умолчанию — const, а let — только если значение действительно будет меняться (счётчик, сумма, текущее состояние). Так читателю кода сразу видно, какие значения постоянны.

Ещё есть старое слово var. Оно работает, но ведёт себя неочевидно, и в новом коде его не пишут. Чем оно отличается — в справке Чем отличаются var, let и const.

Объявить переменную можно и без значения: let total; — до первого присваивания в ней лежит undefined. У const значение обязательно сразу.

Имена переменных

Русские буквы в именах технически разрешены, но так не пишут: имена переменных — латиницей, по-английски и по смыслу: price понятнее, чем x или транслит cena.

Типы данных

У каждого значения есть тип — что это за значение и что с ним можно делать. В JavaScript восемь типов.

ТипЧто этоПримеры
numberчисло, целое или дробное42, 3.14, -7
stringстрока, текст"привет", 'JS'
booleanлогическое значениеtrue, false
undefinedзначение не заданоundefined
null«пусто», задано нарочноnull
bigintочень большое целое12345678901234567890n
symbolуникальный идентификаторSymbol("id")
objectобъект: набор значений{ name: "Аня" }, [1, 2, 3]

Первые семь называют простыми (примитивами): это одно значение. Объекты — составные: в них много значений под разными именами. Массивы и функции — тоже объекты, им отведены отдельные уроки.

Тип значения показывает оператор typeof:

JavaScript
console.log(typeof 42);
console.log(typeof 3.14);
console.log(typeof "текст");
console.log(typeof true);
console.log(typeof undefined);
console.log(typeof null);
console.log(typeof [1, 2, 3]);
console.log(typeof { a: 1 });
Вывод
number
number
string
boolean
undefined
object
object
object

typeof null даёт "object" — это давняя ошибка языка, оставленная ради совместимости со старыми сайтами. null — не объект, а отдельный тип. Массив typeof тоже называет объектом; проверить, что значение — массив, можно так: Array.isArray(значение).

простые — одно значение number 42 string "привет" boolean true undefined undefined null null ! bigint 12345678901234567890n symbol Symbol("id") typeof null → "object" — давняя ошибка языка object — составной объект name "Аня" массив 1 2 3 много значений
Семь простых типов хранят по одному значению, а объект и массив — много значений сразу; typeof null по давней ошибке языка даёт "object".

Числа

Целые и дробные числа в JavaScript — один тип number. Дробная часть отделяется точкой, не запятой: 3.14.

JavaScript
console.log(10 / 4);
console.log(0.1 + 0.2);
console.log(1 / 0);
console.log("abc" * 2);
Вывод
2.5
0.30000000000000004
Infinity
NaN

Целые числа точны до 9007199254740991 (это Number.MAX_SAFE_INTEGER). Для больших целых есть тип bigint: к числу дописывают букву n.

Строки

Строку берут в двойные "…" или одинарные '…' кавычки — разницы между ними нет, главное, чтобы строка закрывалась той же кавычкой, что открылась. Третий вид — обратные кавычки (на клавиатуре — клавиша с буквой Ё в английской раскладке). Строка в них называется шаблонной: внутрь можно вставить значение через ${…}.

JavaScript
const name = "Олег";
const items = 3;
const price = 2.5;

console.log("Покупатель: " + name);
console.log(`${name} купил ${items} шт. на ${items * price} руб.`);
console.log(name.length);
console.log(name.toUpperCase());
Вывод
Покупатель: Олег
Олег купил 3 шт. на 7.5 руб.
4
ОЛЕГ
const name = "Олег"; const items = 3; const price = 2.5; `${name} купил ${items} шт. на ${items * price} руб.` 3 * 2.5 вывод: Олег купил 3 шт. на 7.5 руб.
В шаблонной строке в обратных кавычках каждое ${…} заменяется значением: ${name} — на «Олег», ${items} — на 3, а ${items * price} сначала вычисляется как 3 * 2.5 и даёт 7.5.

Шаблонные строки удобнее склейки через +, когда в тексте несколько значений: меньше кавычек и пробелов, которые легко забыть.

Тип меняется вместе со значением

Переменная в JavaScript не привязана к типу: в let можно положить число, а потом строку. Язык это позволяет, но такой код трудно читать: от переменной с одним именем ждут значений одного вида. Держите в переменной значения одного типа.

Коротко

Проверьте себя

1. Какое объявление подходит для значения, которое никогда не меняется?
2. Что выведет console.log(typeof null)?
3. Что выведет программа?
JavaScript
const sum = 15;
console.log("Итого: ${sum}");
console.log(`Итого: ${sum}`);
4. Какое имя переменной допустимо?