ГлавнаяБлог20 каверзных вопросов по приведению типов в JavaScript
Собеседования

20 каверзных вопросов по приведению типов в JavaScript

Разберите 20 вопросов с собеседований по приведению типов в JavaScript: [] + {}, NaN === NaN и другие ловушки. Узнайте, как работает + и ==, чтобы не попасться.

Al
Редакция Algolitalgolit.ru
15 мин чтения26 июля 2026 г.

Зачем это читать

На собеседованиях после разминки интервьюеры любят задавать однострочники вроде [] + {} или NaN === NaN и смотреть, угадаете ли вы ответ, замрёте или спокойно объясните правила приведения. Эта статья — сборник из 20 реальных вопросов с пошаговым разбором. Попробуйте предсказать вывод каждого примера, прежде чем открывать ответ. К концу вы будете уверенно проходить любые вопросы по приведению типов и строгому/нестрогому равенству.

Краткая модель работы оператора +

Когда JavaScript встречает a + b, он делает следующее:

  1. Преобразует оба операнда в примитивы (ToPrimitive).
  2. Если хотя бы один результат — строка, то выполняется конкатенация: String(a) + String(b).
  3. Иначе — числовое сложение: Number(a) + Number(b).

Для обычных объектов и массивов ToPrimitive обычно вызывает .toString(). Вот таблица преобразований:

ЗначениеString(value)Number(value)
[]""0
[1, 2]"1,2"NaN
{}"[object Object]"NaN
null"null"0
undefined"undefined"NaN
true"true"1
false"false"0

Этого достаточно, чтобы решить большинство задач.

Вопрос 1: [] + []

console.log([] + []);

Ответ: "" (пустая строка).
Разбор: Оба массива преобразуются в строки: String([])"". Получаем "" + """". Многие ошибочно говорят 0 или [], но пустой массив даёт пустую строку.

Вопрос 2: [] + {}

console.log([] + {});

Ответ: "[object Object]".
Разбор: String([])"", String({})"[object Object]". Конкатенация: "" + "[object Object]".

Вопрос 3: ({} + []) со скобками

console.log({} + []);
console.log(({} + []));

Ответ: "[object Object]" в обоих случаях.
Разбор: Внутри console.log фигурные скобки — объектный литерал. String({})"[object Object]", String([])"". Результат: "[object Object]".

Вопрос 4: Знаменитая ловушка {} + [] без скобок

eval('{} + []');
eval('({} + [])');

Ответ: 0 и "[object Object]".
Разбор: В начале выражения {} может быть воспринят как пустой блок, а не объект. Остаётся унарный +[], который даёт 0. Со скобками ({}) — это объект, результат "[object Object]".

Вопрос 5: Массивы со значениями

console.log([1, 2] + [3, 4]);

Ответ: "1,23,4".
Разбор: String([1,2])"1,2", String([3,4])"3,4". Конкатенация без пробелов.

Вопрос 6: NaN === NaN

console.log(NaN === NaN);
console.log(NaN == NaN);

Ответ: false в обоих случаях.
Разбор: По стандарту IEEE-754 NaN не равен ничему, включая себя. Правильные проверки: Number.isNaN(NaN) или Object.is(NaN, NaN).

Вопрос 7: Как рождается NaN

console.log(Number('abc'));
console.log('abc' - 1);
console.log(undefined + 1);
console.log(NaN + 5);
console.log(typeof NaN);

Ответ: NaN, NaN, NaN, NaN, "number".
Разбор: Неудачное преобразование в число даёт NaN. Любая операция с NaN возвращает NaN. typeof NaN"number".

Вопрос 8: Object.is vs ===

console.log(Object.is(NaN, NaN));
console.log(Object.is(+0, -0));
console.log(+0 === -0);

Ответ: true, false, true.
Разбор: Object.is считает NaN равным NaN, а +0 и -0 разными. === наоборот: +0 и -0 равны.

Вопрос 9: + и - со строками

console.log('5' + 2);
console.log('5' - 2);
console.log('5' * '2');
console.log('5' + '2');

Ответ: "52", 3, 10, "52".
Разбор: + со строкой даёт конкатенацию. -, *, / всегда числовые.

Вопрос 10: Булевы значения в математике

console.log(true + true);
console.log(true + false);
console.log(true + '1');
console.log(false - true);

Ответ: 2, 1, "true1", -1.
Разбор: true → 1, false → 0. true + '1' — строка.

Вопрос 11: Унарный плюс для [] и {}

console.log(+[]);
console.log(+{});
console.log(Number([]));
console.log(Number({}));

Ответ: 0, NaN, 0, NaN.
Разбор: +[]Number("") → 0. +{}Number("[object Object]") → NaN.

Вопрос 12: null и undefined с +

console.log(null + 1);
console.log(undefined + 1);
console.log([] + null);
console.log(null + []);

Ответ: 1, NaN, "null", "null".
Разбор: Численно null → 0, undefined → NaN. С массивами — конкатенация строк.

Вопрос 13: null == undefined и другие

console.log(null == undefined);
console.log(null === undefined);
console.log(null == 0);
console.log(undefined == 0);
console.log(null == false);

Ответ: true, false, false, false, false.
Разбор: Спецификация: null == undefined — истина. Остальные — ложь.

Вопрос 14: Пустой массив vs пустая строка vs 0

console.log([] == 0);
console.log([] == '');
console.log('' == 0);
console.log([] == false);
console.log(false == '');

Ответ: все true.
Разбор: == последовательно приводит: []"" → 0, false → 0. Все сходятся к 0 или пустой строке.

Вопрос 15: Вирусный [] == ![]

console.log(![]);
console.log([] == ![]);

Ответ: false, true.
Разбор: [] — truthy, поэтому ![]false. Выражение: [] == false. false → 0, []"" → 0. Итог: 0 == 0 → true.

Вопрос 16: Truthy/falsy сюрпризы

console.log(Boolean([]));
console.log(Boolean({}));
console.log(Boolean(''));
console.log(Boolean(0));
console.log(Boolean(NaN));
console.log(Boolean(null));
console.log(!!'0');

Ответ: true, true, false, false, false, false, true.
Разбор: Только 6 falsy-значений: false, 0, -0, 0n, '', null, undefined, NaN. Всё остальное truthy, включая [], {} и '0'.

Вопрос 17: Сравнение по ссылке

console.log([] === []);
console.log({} === {});
console.log([] == []);
console.log({} == {});
const a = [];
console.log(a === a);

Ответ: все false, кроме true для a === a.
Разбор: Объекты и массивы сравниваются по ссылке, а не по содержимому. Каждый литерал создаёт новый объект.

Вопрос 18: typeof null

console.log(typeof null);
console.log(typeof []);
console.log(typeof {});
console.log(typeof NaN);
console.log(Array.isArray([]));

Ответ: "object", "object", "object", "number", true.
Разбор: typeof null === "object" — известный баг. Массивы — тоже объекты. NaN — число.

Вопрос 19: Проблема чисел с плавающей точкой

console.log(0.1 + 0.2);
console.log(0.1 + 0.2 === 0.3);

Ответ: 0.30000000000000004, false.
Разбор: Двоичное представление не может точно хранить 0.1 и 0.2. Используйте Number.EPSILON или библиотеки для десятичных чисел.

Вопрос 20: Сборная солянка

console.log([] + {});
console.log({} + []);
console.log([] + [] + 'ok');
console.log('' + 1 + 0);
console.log('' - 1 + 0);
console.log(true + true + true);
console.log(!![]);
console.log(Number.isNaN(NaN) && !(NaN === NaN));

Ответ: "[object Object]", "[object Object]", "ok", "10", -1, 3, true, true.
Разбор: [] + {} и {} + [] дают строку. [] + [] + 'ok'"ok". '' + 1 + 0 → конкатенация. '' - 1 → число. true + true + true → 3. !![] → true. Number.isNaN(NaN) && !(NaN === NaN) → true && true → true.

Практический вывод

Потренируйтесь прямо сейчас: откройте консоль браузера или Node.js и введите каждый пример из этой статьи. Проговаривайте ответ вслух перед запуском. Это закрепит правила приведения типов на уровне интуиции. На собеседовании не бойтесь пауз — лучше спокойно проговорить шаги преобразования, чем выпалить неверный ответ. Помните: === — ваш друг, а == используйте только осознанно.

#приведение типов#JavaScript#собеседование#NaN#оператор равенства
Al
Редакция Algolit

Пишем про алгоритмы, подготовку к собеседованиям и карьеру в IT — так, чтобы было понятно и полезно.

Хочешь закрепить знания на практике?

Решай задачи на Algolit — интерактивная платформа для обучения

Начать бесплатно →