Типы данных и приведение типов

Основы фронтенд разработки

Типы данных и приведение типов

Продолжительность: 25 мин

В прошлом уроке мы записывали в переменные разные значения — текст, числа, и видели undefined. Всё это разные типы данных. JavaScript автоматически определяет тип по значению — это называется динамической типизацией. Переменная не привязана к типу и в неё можно положить сначала число, а потом строку. Это удобно для старта, но требует понимания того, как типы работают.

Примитивные типы

Примитивные типы — это базовые «кирпичики» данных в JavaScript. Их шесть.

string — строка, любой текст. Строки записываются в одинарных, двойных или обратных кавычках:

let city = 'Санкт-Петербург'; let greeting = "Добро пожаловать"; let message = `Добро пожаловать в ${city}`; // шаблонная строка
js

Обратные кавычки — это шаблонные строки. Внутри них можно вставлять значения переменных через ${}, что очень удобно и не раз пригодится нам в рамках данного курса.

number — число. В JavaScript нет отдельных типов для целых и дробных чисел — это всегда просто number:

let age = 320; let price = 4.99; let temperature = -5;
js

Есть специальные числовые значения: Infinity (бесконечность) и NaN (Not a Number — «не число»). NaN появляется, когда результат математической операции не является числом:

console.log(0 / 0); // NaN console.log('abc' * 2); // NaN
js

boolean — логический тип, может принимать только два значения: true или false. Используется для условий и флагов состояния:

let isOpen = true; let hasError = false;
js

undefined — значение, которое переменная имеет по умолчанию, если ей ничего не присвоено:

let result; console.log(result); // undefined
js

null — явное «пустое» значение. В отличие от undefined (переменная просто не инициализирована), null — это намеренное «здесь ничего нет»:

let selectedUser = null; // пользователь ещё не выбран
js

symbol и bigint — более специфичные типы, которые в базовой разработке встречаются редко. Просто знайте, что они существуют.

Оператор typeof

Узнать тип значения можно с помощью оператора typeof:

console.log(typeof 'привет'); // string console.log(typeof 42); // number console.log(typeof true); // boolean console.log(typeof undefined); // undefined console.log(typeof null); // object ← об этом ниже
js

Объекты

Помимо примитивов в JavaScript есть объекты. Объект — это набор данных в формате «ключ: значение». С его помощью можно описать что-то составное:

const city = { name: 'Санкт-Петербург', foundedYear: 1703, isCapital: false, }; console.log(city.name); // Санкт-Петербург console.log(city.foundedYear); // 1703
js

Обратиться к свойству объекта можно через точку (city.name) или через квадратные скобки (city['name']).

Массивы — это тоже объекты, просто с числовыми ключами и удобным синтаксисом:

const attractions = ['Эрмитаж', 'Петергоф', 'Исаакиевский собор']; console.log(attractions[0]); // Эрмитаж console.log(attractions.length); // 3
js

Ключевое отличие объектов от примитивов: примитивы хранятся «по значению», а объекты — «по ссылке». На практике это значит, что две переменные могут указывать на один и тот же объект:

const a = { count: 1 }; const b = a; // b указывает на тот же объект b.count = 99; console.log(a.count); // 99 — изменение через b затронуло a
js

Приведение типов

JavaScript умеет автоматически преобразовывать типы, и это поведение поначалу может удивить. Например:

console.log('5' + 2); // '52' — число превратилось в строку console.log('5' - 2); // 3 — строка превратилась в число console.log(true + 1); // 2 — true это 1 console.log(false + 1); // 1 — false это 0
js

Что здесь происходит? Когда оператор встречает несовместимые типы, он пытается привести их к общему знаменателю. Правила этого приведения определены в спецификации языка и работают предсказуемо — просто нужно их знать.

Особого внимания заслуживает сравнение. В JavaScript есть два оператора равенства:

  • == — нестрогое равенство, при сравнении JavaScript приводит типы;
  • === — строгое равенство, типы не приводятся.
console.log(5 == '5'); // true — строка привелась к числу console.log(5 === '5'); // false — разные типы console.log(null == undefined); // true console.log(null === undefined); // false
js

На практике всегда используйте ===. Нестрогое сравнение == поведение которого сложно запомнить, лучше избегать.

«Странное» поведение JS

Вот несколько примеров, которые часто цитируют как «странности» JavaScript:

console.log(typeof null); // 'object' — известный баг в языке, сохранён для обратной совместимости console.log(NaN === NaN); // false — NaN не равен самому себе console.log([] + []); // '' — два пустых массива складываются в пустую строку console.log([] + {}); // '[object Object]'
js

Всё это выглядит пугающе, пока не знаешь правил. На самом деле за каждым таким примером стоит вполне конкретная логика преобразования типов. Для проверки существует даже отдельный сайт wtfjs.com — можно почитать с объяснениями.

В реальном коде такие ситуации встречаются редко, если использовать === и следить за типами. Не нужно бояться JavaScript — нужно понимать его правила.

В следующем уроке поговорим о функциях — одной из ключевых концепций в программировании.

Это платный урок

Купите полный доступ к курсу чтобы просматривать данный контент

Основы фронтенд разработки

Полный курс по основам веб-разработки с нуля: HTML, CSS и JavaScript. Вы сверстаете адаптивный лендинг, освоите анимации и работу с DOM, а в финале соберёте самостоятельный проект — интерактивный путеводитель по Санкт-Петербургу.

4990 Скидка 20%
3990

Безопасные платежи обрабатываются сервисом Юкасса

Комментарии

Войдите, чтобы оставить комментарий