Восемь типов данных
Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.
Любое значение в JavaScript относится к одному из восьми типов: семь «простых» — примитивы — и один составной, объект. Разберём каждый и научимся определять тип оператором typeof.
Переменная в JavaScript не привязана к типу. Она — коробка с этикеткой: сегодня внутри число, завтра строка, и это не ошибка, а свойство языка.
запомнить легко: 7 примитивов + object = 8 типов
Один тип на всё: целые, дробные, отрицательные. Внутри него живут и три специальных значения: Infinity, -Infinity и NaN — «не число», результат сломанной математики. Важная особенность: математика в JavaScript безопасна — скрипт не упадёт от деления на ноль, вы просто получите специальное значение.
Числа хранятся в двоичном формате IEEE 754. Дробь 0.1 в двоичной системе — бесконечная периодическая, как ⅓ в десятичной. Её приходится округлить, и крошечная погрешность всплывает при сложении:
Это не баг JavaScript — так же ведут себя Python, Java и почти все языки.
Тип number честен только до 253−1 (это 9007199254740991). Дальше — потеря точности. Для криптографии, финансов и меток времени с наносекундами есть bigint: к целому числу добавляется суффикс n.
Три вида кавычек: одинарные, двойные и обратные. Первые две пары равнозначны, а обратные — «умные»: внутри ${…} можно вставить любое выражение.
Всего два значения — true и false. Появляются чаще всего как результат сравнения: 4 > 1 — это уже true.
Два типа-одиночки: в каждом ровно одно значение. Разница смысловая:
null — «здесь намеренно пусто». Это программист положил пустоту в коробку. undefined — «значение не присвоено вовсе»: так выглядит объявленная, но не заполненная переменная.
Это официально признанная ошибка языка из 1995 года. В первой реализации тип значения кодировался тегом в младших битах, и у null тег совпал с объектным. Исправить нельзя: миллионы сайтов уже полагаются на это поведение. Просто запомните: null — не объект, это отдельный примитив.
Всё перечисленное выше — примитивы: одно значение — одна «капля» данных. Тип object — составной: он хранит коллекции данных и целые структуры. Объектам посвящена отдельная глава, и открывает её статья «Объекты и ссылки». А symbol создаёт уникальные идентификаторы — экзотика, до которой дело дойдёт в конце той же главы, в статье «Symbol: уникальные ключи».
Возвращает имя типа строкой. Полная карта — с двумя историческими сюрпризами:
| Значение | typeof вернёт |
|---|---|
42 | "number" |
42n | "bigint" |
"текст" | "string" |
true | "boolean" |
undefined | "undefined" |
null | "object" — ошибка языка! |
Symbol("id") | "symbol" |
alert | "function" — функции тоже объекты |
- 8 типов:
number,bigint,string,boolean,null,undefined,symbol— примитивы, плюс составнойobject. - Типизация динамическая: переменная может сменить тип.
typeof xвозвращает тип строкой; помните два сюрприза —nullи функции.
1/3Что вернёт typeof "42"?
2/3Что вернёт typeof null?
3/3Чему равно NaN === NaN?
Строка с сюрпризом
Что выведет этот код? Ответьте, не запуская:
Обратные кавычки вычисляют выражение внутри ${…}: выведется привет, 1, затем привет, name (строка в кавычках — просто строка!) и привет, Ира. Нажмите Run выше и проверьте себя.
Двойной typeof
Что вернёт выражение typeof typeof 1? Сначала подумайте, потом проверьте в любом примере выше.
"string". Внутренний typeof 1 вернёт строку "number", а тип любой строки — string.