Глубокое сравнение объектов

Medium
ObjectRecursionOzon

Реализуйте deepEqual(a, b) — функцию структурного сравнения двух значений. В отличие от ===, она сравнивает объекты и массивы по содержимому, а не по ссылке.

deepEqual({a: 1, b: {c: 2}}, {a: 1, b: {c: 2}}) // true
deepEqual([1, [2, 3]], [1, [2, 3]])               // true  — разные ссылки, одно содержимое
deepEqual({a: 1}, {a: "1"})                       // false — 1 !== "1"

Ограничения: входные данные — примитивы, null, plain objects и массивы. Циклических ссылок нет.

Подсказка

Ключевая ловушка: typeof null === 'object'. Без явной проверки на null функция упадёт при попытке взять Object.keys(null).

Подсказка

После решения могут спросить: как обработать циклические ссылки? (Ответ: WeakSet или WeakMap для отслеживания уже посещённых объектов.) Как сравнить Date, Map, Set? (Ответ: отдельные ветки с instanceof.)

Ваш код - JavaScript
Результаты
Нажмите «Запуск» для выполнения кода