Типы данных
Типы данных
Технический фундамент типовой модели
Перед практикой полезно зафиксировать инженерные инварианты работы с типами:
- тип определяет допустимые операции и форму результата;
- неявные преобразования могут менять логику без явной ошибки;
- проверка типа на границе данных дешевле, чем отладка глубоко в сценарии;
- разные типы одинаково объявляются, но по-разному ведут себя в памяти и сравнении.
Эта база нужна, чтобы писать код, который стабильно работает на валидных и невалидных входах.
Почему типы данных важны с самого старта
Каждое значение в 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).- Четкая работа с типами на старте сильно снижает количество ошибок в реальных сценариях.