Когда Notion сохраняет задачу, он хранит разные данные: название задачи — текст, дата дедлайна — дата, выполнена ли — да/нет, приоритет — число. Это разные типы данных, и JavaScript работает с каждым по-своему.
Мы уже создавали переменные через const и let. Теперь разберёмся что именно можно в них хранить.
Компьютер не понимает разницу между "1000" и 1000 без подсказки. Первое — текст из трёх символов, второе — число для вычислений. Типы данных говорят JS как работать с каждым значением.
Примитивные типы (простые значения):
'Привет', "мир", шаблонные литералы ``Привет, ${name}42, 3.14, -100, Infinity, NaNtrue или falseОбъектный тип:
Оператор typeof возвращает строку с типом:
typeof 'текст' // 'string'
typeof 42 // 'number'
typeof true // 'boolean'
typeof null // 'object' <- историческая ошибка в JS!
typeof undefined // 'undefined'
typeof {} // 'object'
typeof [] // 'object'const name = 'Мария'
const age = 25
// Старый способ (неудобно)
console.log('Привет, ' + name + '! Тебе ' + age + ' лет.')
// Шаблонный литерал (читаемо)
console.log(`Привет, ${name}! Тебе ${age} лет.`)
// Внутри ${} можно писать любые выражения
console.log(`Через 5 лет тебе будет ${age + 5} лет.`)Ошибка 1: Строка вместо числа в вычислениях
const price = '1000' // получили из формы как строку
const tax = price * 0.2 // 200 — JS неявно преобразует в число
const total = price + tax // '1000200' — НЕ 1200! Конкатенация!
// Правильно: const price = Number('1000') или parseInt('1000')Ошибка 2: Сравнивать null и undefined неправильно
let userEmail = undefined
if (userEmail == null) console.log('нет email') // true — == сравнивает оба
if (userEmail === null) console.log('точно null') // false — === строгое
// Для проверки null/undefined используй == null (оба варианта)Ошибка 3: typeof null возвращает 'object'
const data = null
if (typeof data === 'object') {
data.name // TypeError! null — не объект, это баг в JS
}
// Правильно: проверяй data !== null && typeof data === 'object'Понимание типов критично при работе с данными из API — они приходят в JSON где нет разницы между числом и строкой, и неправильный тип ломает вычисления. TypeScript добавляет строгую типизацию поверх JS именно для борьбы с такими ошибками.
Карточка задачи в трекере (как в Notion или Jira)
// Разные типы данных в одной задаче
const taskTitle = 'Сделать редизайн главной страницы' // string
const priority = 3 // number: 1=низкий, 3=высокий
const isCompleted = false // boolean
const assignedTo = 'Алексей' // string
const dueDate = '2024-03-15' // string (дата как текст)
const deletedAt = null // null — задача не удалена
// typeof показывает тип каждого значения
console.log(typeof taskTitle) // 'string'
console.log(typeof priority) // 'number'
console.log(typeof isCompleted) // 'boolean'
console.log(typeof deletedAt) // 'object' (ловушка! null — не объект)
// Шаблонный литерал собирает красивую строку
console.log(`[${isCompleted ? 'x' : ' '}] ${taskTitle} (P${priority})`)
// [ ] Сделать редизайн главной страницы (P3)
// Арифметика с числом работает нормально
console.log('Дней до дедлайна: ' + 7) // 'Дней до дедлайна: 7'
console.log('Приоритет * 2: ' + priority * 2) // 'Приоритет * 2: 6'Когда Notion сохраняет задачу, он хранит разные данные: название задачи — текст, дата дедлайна — дата, выполнена ли — да/нет, приоритет — число. Это разные типы данных, и JavaScript работает с каждым по-своему.
Мы уже создавали переменные через const и let. Теперь разберёмся что именно можно в них хранить.
Компьютер не понимает разницу между "1000" и 1000 без подсказки. Первое — текст из трёх символов, второе — число для вычислений. Типы данных говорят JS как работать с каждым значением.
Примитивные типы (простые значения):
'Привет', "мир", шаблонные литералы ``Привет, ${name}42, 3.14, -100, Infinity, NaNtrue или falseОбъектный тип:
Оператор typeof возвращает строку с типом:
typeof 'текст' // 'string'
typeof 42 // 'number'
typeof true // 'boolean'
typeof null // 'object' <- историческая ошибка в JS!
typeof undefined // 'undefined'
typeof {} // 'object'
typeof [] // 'object'const name = 'Мария'
const age = 25
// Старый способ (неудобно)
console.log('Привет, ' + name + '! Тебе ' + age + ' лет.')
// Шаблонный литерал (читаемо)
console.log(`Привет, ${name}! Тебе ${age} лет.`)
// Внутри ${} можно писать любые выражения
console.log(`Через 5 лет тебе будет ${age + 5} лет.`)Ошибка 1: Строка вместо числа в вычислениях
const price = '1000' // получили из формы как строку
const tax = price * 0.2 // 200 — JS неявно преобразует в число
const total = price + tax // '1000200' — НЕ 1200! Конкатенация!
// Правильно: const price = Number('1000') или parseInt('1000')Ошибка 2: Сравнивать null и undefined неправильно
let userEmail = undefined
if (userEmail == null) console.log('нет email') // true — == сравнивает оба
if (userEmail === null) console.log('точно null') // false — === строгое
// Для проверки null/undefined используй == null (оба варианта)Ошибка 3: typeof null возвращает 'object'
const data = null
if (typeof data === 'object') {
data.name // TypeError! null — не объект, это баг в JS
}
// Правильно: проверяй data !== null && typeof data === 'object'Понимание типов критично при работе с данными из API — они приходят в JSON где нет разницы между числом и строкой, и неправильный тип ломает вычисления. TypeScript добавляет строгую типизацию поверх JS именно для борьбы с такими ошибками.
Карточка задачи в трекере (как в Notion или Jira)
// Разные типы данных в одной задаче
const taskTitle = 'Сделать редизайн главной страницы' // string
const priority = 3 // number: 1=низкий, 3=высокий
const isCompleted = false // boolean
const assignedTo = 'Алексей' // string
const dueDate = '2024-03-15' // string (дата как текст)
const deletedAt = null // null — задача не удалена
// typeof показывает тип каждого значения
console.log(typeof taskTitle) // 'string'
console.log(typeof priority) // 'number'
console.log(typeof isCompleted) // 'boolean'
console.log(typeof deletedAt) // 'object' (ловушка! null — не объект)
// Шаблонный литерал собирает красивую строку
console.log(`[${isCompleted ? 'x' : ' '}] ${taskTitle} (P${priority})`)
// [ ] Сделать редизайн главной страницы (P3)
// Арифметика с числом работает нормально
console.log('Дней до дедлайна: ' + 7) // 'Дней до дедлайна: 7'
console.log('Приоритет * 2: ' + priority * 2) // 'Приоритет * 2: 6'Ты создаёшь карточку товара для маркетплейса. Объяви переменные разных типов: название товара (string), цена (number), есть ли в наличии (boolean), скидка если есть (number или null). Выведи typeof каждой переменной и собери описание через шаблонный литерал.
null — это явное отсутствие значения: const discount = null. Шаблонный литерал: `текст ${переменная}`