В этом посте я объясню решение упражнения Deep Comparison в книге Eloquent Javascript (3-е издание, глава 4):

Напишите функцию deepEqual, которая принимает два значения и возвращает истину, только если они имеют одинаковое значение или являются объектами с одинаковыми свойствами, где значения свойств равны по сравнению с рекурсивным вызовом deepEqual.

Давайте разберем упражнение на более мелкие части и объясним его шаг за шагом:

Шаг 1:

Функция deepEqual принимает два аргумента; значение 1 (v1) и значение 2 (v2). На первом этапе мы будем использовать оператор строгого равенства (===), чтобы проверить, совпадают ли типы и значения двух аргументов.

Шаг 2:

Затем нам нужно проверить, являются ли типы обоих аргументов object, а не null. Если оба аргумента равны object, мы продолжим и сравним их свойства с помощью глубокого сравнения.

Шаг 3:

Убедившись, что оба аргумента object, мы проверим, имеют ли они одинаковые свойства и значения. Сравнение количества ключей objects '- хорошее начало для исключения тех, у которых различается длина своих свойств. Мы будем использовать метод Object.keys(), чтобы вернуть список свойств objects и установить переменные v1keys & v2keys.

Шаг 4:

На последнем шаге мы переберем все свойства v1 с помощью цикла for in, чтобы убедиться, что каждое свойство в v1 также существует в v2. Если сравниваемые objects имеют одинаковые свойства, проверка их значений будет последним делом. Здесь нам нужно рекурсивно использовать функцию deepEqual (вызывая себя), передавая в нее значения каждого свойства, чтобы проверить, равны ли они. Если есть свойство с разными значениями каждого объекта, оно выйдет из цикла и вернет false.

Если ни одно из вышеперечисленных условий не выполняется после того, как цикл проверяет каждое свойство и значение, он вернет true в конце функции. Вот полная функция со всеми объясненными шагами:

Надеюсь, это поможет, спасибо за чтение!