В этом посте я объясню решение упражнения Deep Comparison в книге Eloquent Javascript (3-е издание, глава 4):
Напишите функцию deepEqual
, которая принимает два значения и возвращает истину, только если они имеют одинаковое значение или являются объектами с одинаковыми свойствами, где значения свойств равны по сравнению с рекурсивным вызовом deepEqual
.
Давайте разберем упражнение на более мелкие части и объясним его шаг за шагом:
Шаг 1:
Функция deepEqual
принимает два аргумента; значение 1 (v1
) и значение 2 (v2
). На первом этапе мы будем использовать оператор строгого равенства (===)
, чтобы проверить, совпадают ли типы и значения двух аргументов.
Шаг 2:
Затем нам нужно проверить, являются ли типы обоих аргументов object
, а не null
. Если оба аргумента равны object
, мы продолжим и сравним их свойства с помощью глубокого сравнения.
Шаг 3:
Убедившись, что оба аргумента object
, мы проверим, имеют ли они одинаковые свойства и значения. Сравнение количества ключей object
s '- хорошее начало для исключения тех, у которых различается длина своих свойств. Мы будем использовать метод Object.keys()
, чтобы вернуть список свойств object
s и установить переменные v1keys
& v2keys
.
Шаг 4:
На последнем шаге мы переберем все свойства v1
с помощью цикла for in
, чтобы убедиться, что каждое свойство в v1
также существует в v2
. Если сравниваемые objects
имеют одинаковые свойства, проверка их значений будет последним делом. Здесь нам нужно рекурсивно использовать функцию deepEqual
(вызывая себя), передавая в нее значения каждого свойства, чтобы проверить, равны ли они. Если есть свойство с разными значениями каждого объекта, оно выйдет из цикла и вернет false.
Если ни одно из вышеперечисленных условий не выполняется после того, как цикл проверяет каждое свойство и значение, он вернет true в конце функции. Вот полная функция со всеми объясненными шагами:
Надеюсь, это поможет, спасибо за чтение!