Восемь типов данных

данные≈ 7 минут

Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.

Любое значение в JavaScript относится к одному из восьми типов: семь «простых» — примитивы — и один составной, объект. Разберём каждый и научимся определять тип оператором typeof.

Разделы темы:·

Переменная в JavaScript не привязана к типу. Она — коробка с этикеткой: сегодня внутри число, завтра строка, и это не ошибка, а свойство языка.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

запомнить легко: 7 примитивов + object = 8 типов

Один тип на всё: целые, дробные, отрицательные. Внутри него живут и три специальных значения: Infinity, -Infinity и NaN — «не число», результат сломанной математики. Важная особенность: математика в JavaScript безопасна — скрипт не упадёт от деления на ноль, вы просто получите специальное значение.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Числа хранятся в двоичном формате IEEE 754. Дробь 0.1 в двоичной системе — бесконечная периодическая, как ⅓ в десятичной. Её приходится округлить, и крошечная погрешность всплывает при сложении:

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Это не баг JavaScript — так же ведут себя Python, Java и почти все языки.

Тип number честен только до 253−1 (это 9007199254740991). Дальше — потеря точности. Для криптографии, финансов и меток времени с наносекундами есть bigint: к целому числу добавляется суффикс n.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Три вида кавычек: одинарные, двойные и обратные. Первые две пары равнозначны, а обратные — «умные»: внутри ${…} можно вставить любое выражение.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Всего два значения — 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?

Строка с сюрпризом

Что выведет этот код? Ответьте, не запуская:

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Обратные кавычки вычисляют выражение внутри ${…}: выведется привет, 1, затем привет, name (строка в кавычках — просто строка!) и привет, Ира. Нажмите Run выше и проверьте себя.

Двойной typeof

Что вернёт выражение typeof typeof 1? Сначала подумайте, потом проверьте в любом примере выше.

"string". Внутренний typeof 1 вернёт строку "number", а тип любой строки — string.