Типы данных

Типы данных

Технический фундамент типовой модели

Перед практикой полезно зафиксировать инженерные инварианты работы с типами:

  • тип определяет допустимые операции и форму результата;
  • неявные преобразования могут менять логику без явной ошибки;
  • проверка типа на границе данных дешевле, чем отладка глубоко в сценарии;
  • разные типы одинаково объявляются, но по-разному ведут себя в памяти и сравнении.

Эта база нужна, чтобы писать код, который стабильно работает на валидных и невалидных входах.

Почему типы данных важны с самого старта

Каждое значение в JavaScript имеет тип: число, строка, логическое значение, объект и так далее. От типа зависит, какие операции допустимы и какой результат ты получишь. Многие новичковые баги возникают не из-за сложной логики, а из-за неправильного понимания типа входных данных.

Ключевой момент: перед любой операцией полезно понимать, с каким типом ты сейчас работаешь.

Проверь себя: почему "10" + 5 и 10 + 5 дают разный результат?

Примитивные и ссылочные типы

В JavaScript типы условно делят на две группы:

  • примитивные: string, number, boolean, null, undefined, bigint, symbol;
  • ссылочные: object (включая array и функции).

Примитив хранится как самостоятельное значение. Ссылочный тип хранится как ссылка на структуру в памяти.

const age = 25; // number
const name = 'Anna'; // string
const isActive = true; // boolean
const user = { id: 1, name: 'Anna' }; // object

Смотри, что важно: одинаковый синтаксис const x = ... не означает одинаковое поведение в памяти.

Динамическая типизация

JavaScript динамически типизирован: тип у значения, а не у переменной. Одна и та же переменная может получить новое значение другого типа.

let value = 42;
value = '42';

Это гибко, но рискованно. Если не контролировать входы, логика начинает вести себя непредсказуемо.

Анти-провал: на границах данных (форма, API, URL-параметры) сразу нормализуй типы.

Как быстро проверять тип

Базовый инструмент - оператор typeof.

console.log(typeof 10); // 'number'
console.log(typeof 'hi'); // 'string'
console.log(typeof true); // 'boolean'
console.log(typeof undefined); // 'undefined'
console.log(typeof {}); // 'object'
console.log(typeof function () {}); // 'function'
console.log(typeof []); // 'object'

Здесь часто путаются: typeof null вернет 'object' (историческая особенность JS).

Анти-провал: для реальной проверки чаще используют более точные условия:

const value = null;
console.log(value === null); // true
console.log(Array.isArray([])); // true

Проверь себя: почему null и объект нельзя считать одним типом, несмотря на typeof?

Мини-сценарий из продукта

Сценарий: проверка балла урока, пришедшего из формы.

const rawScore = '80'; // строка из input
const score = Number(rawScore); // приводим к number
const status = score >= 70 ? 'passed' : 'retry';

Если не привести тип, ты легко получишь ошибки на сравнениях и вычислениях.

Еще один сценарий: API возвращает null вместо объекта профиля. Если не проверить тип, обращение к полям вызовет runtime-ошибку.

Частые ошибки новичков

  • Сравнивать значения, не проверив тип входа.
  • Надеяться на неявные преобразования (==, сложение строк/чисел).
  • Путать пустую строку '', null и undefined.
  • Считать, что array и object - полностью разные категории, хотя массив технически объект.

Анти-провал: при сомнениях сначала логируй значение и его тип, потом принимай решение.

Что будет, если изменить входные данные

Если rawScore = '80', после Number получишь 80. Если rawScore = 'abc', получишь NaN, и условие сработает не так, как ты ожидаешь. Значит, кроме приведения нужен контроль невалидных значений (Number.isNaN).

Проверь себя: что вернет typeof NaN и почему это может путать?

Краткий итог

  • Типы данных определяют допустимые операции и результат выражений.
  • В JS есть примитивные и ссылочные типы.
  • Язык динамически типизирован, поэтому контроль входов критичен.
  • typeof полезен, но имеет особенности (null).
  • Четкая работа с типами на старте сильно снижает количество ошибок в реальных сценариях.