Реализуйте 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.)