Разберите 20 вопросов с собеседований по приведению типов в JavaScript: [] + {}, NaN === NaN и другие ловушки. Узнайте, как работает + и ==, чтобы не попасться.
На собеседованиях после разминки интервьюеры любят задавать однострочники вроде [] + {} или NaN === NaN и смотреть, угадаете ли вы ответ, замрёте или спокойно объясните правила приведения. Эта статья — сборник из 20 реальных вопросов с пошаговым разбором. Попробуйте предсказать вывод каждого примера, прежде чем открывать ответ. К концу вы будете уверенно проходить любые вопросы по приведению типов и строгому/нестрогому равенству.
+Когда JavaScript встречает a + b, он делает следующее:
String(a) + String(b).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 |
Этого достаточно, чтобы решить большинство задач.
[] + []console.log([] + []);Ответ: "" (пустая строка).
Разбор: Оба массива преобразуются в строки: String([]) → "". Получаем "" + "" → "". Многие ошибочно говорят 0 или [], но пустой массив даёт пустую строку.
[] + {}console.log([] + {});Ответ: "[object Object]".
Разбор: String([]) → "", String({}) → "[object Object]". Конкатенация: "" + "[object Object]".
({} + []) со скобкамиconsole.log({} + []);
console.log(({} + []));Ответ: "[object Object]" в обоих случаях.
Разбор: Внутри console.log фигурные скобки — объектный литерал. String({}) → "[object Object]", String([]) → "". Результат: "[object Object]".
{} + [] без скобокeval('{} + []');
eval('({} + [])');Ответ: 0 и "[object Object]".
Разбор: В начале выражения {} может быть воспринят как пустой блок, а не объект. Остаётся унарный +[], который даёт 0. Со скобками ({}) — это объект, результат "[object Object]".
console.log([1, 2] + [3, 4]);Ответ: "1,23,4".
Разбор: String([1,2]) → "1,2", String([3,4]) → "3,4". Конкатенация без пробелов.
NaN === NaNconsole.log(NaN === NaN);
console.log(NaN == NaN);Ответ: false в обоих случаях.
Разбор: По стандарту IEEE-754 NaN не равен ничему, включая себя. Правильные проверки: Number.isNaN(NaN) или Object.is(NaN, 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".
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 равны.
+ и - со строкамиconsole.log('5' + 2);
console.log('5' - 2);
console.log('5' * '2');
console.log('5' + '2');Ответ: "52", 3, 10, "52".
Разбор: + со строкой даёт конкатенацию. -, *, / всегда числовые.
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' — строка.
[] и {}console.log(+[]);
console.log(+{});
console.log(Number([]));
console.log(Number({}));Ответ: 0, NaN, 0, NaN.
Разбор: +[] → Number("") → 0. +{} → Number("[object Object]") → NaN.
null и undefined с +console.log(null + 1);
console.log(undefined + 1);
console.log([] + null);
console.log(null + []);Ответ: 1, NaN, "null", "null".
Разбор: Численно null → 0, undefined → NaN. С массивами — конкатенация строк.
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 — истина. Остальные — ложь.
console.log([] == 0);
console.log([] == '');
console.log('' == 0);
console.log([] == false);
console.log(false == '');Ответ: все true.
Разбор: == последовательно приводит: [] → "" → 0, false → 0. Все сходятся к 0 или пустой строке.
[] == ![]console.log(![]);
console.log([] == ![]);Ответ: false, true.
Разбор: [] — truthy, поэтому ![] → false. Выражение: [] == false. false → 0, [] → "" → 0. Итог: 0 == 0 → true.
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'.
console.log([] === []);
console.log({} === {});
console.log([] == []);
console.log({} == {});
const a = [];
console.log(a === a);Ответ: все false, кроме true для a === a.
Разбор: Объекты и массивы сравниваются по ссылке, а не по содержимому. Каждый литерал создаёт новый объект.
typeof nullconsole.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 — число.
console.log(0.1 + 0.2);
console.log(0.1 + 0.2 === 0.3);Ответ: 0.30000000000000004, false.
Разбор: Двоичное представление не может точно хранить 0.1 и 0.2. Используйте Number.EPSILON или библиотеки для десятичных чисел.
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 и введите каждый пример из этой статьи. Проговаривайте ответ вслух перед запуском. Это закрепит правила приведения типов на уровне интуиции. На собеседовании не бойтесь пауз — лучше спокойно проговорить шаги преобразования, чем выпалить неверный ответ. Помните: === — ваш друг, а == используйте только осознанно.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →