// "Глубокое" сравнение объектов
// т.е. сравнение по всем полям и значениям
// включая вложенные
function deepEqual(a, b) {
// Если переданы ссылки на один объект, то они равны
// Или если переданы равные скалярные значения
if (a === b) return true;
// Если хотя бы один пуст или не является объектом
if (a == null || typeof a != "object" ||
b == null || typeof b != "object") return false;
// Получаем все ключи объектов
let keysA = Object.keys(a), keysB = Object.keys(b);
// Если длина разная, значит ключей разное кол-во, объекты не равны
if (keysA.length != keysB.length) return false;
// Проверка каждого ключа.
// Если хотя бы один отсутствует во втором, - не равны
// Плюс запускается рекурсия по вложенным значениям
for (let key of keysA) {
if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;
}
// Если все проверки пройдены, значит объекты равны
return true;
}
Сергей delphinpro, спасибо огромное!
классно расписали
тоесть а если обобщить то именно по всем этим признакам определяются равны ли объкты?
тоесть это все критирии? или есть еще?
В переменной хранится не сам объект, а только ссылка на него.
При сравнении таких переменных сравниваются не их поля и значения, а проверяется ссылаются ли они на один и тот же объект.
Примеры:
const link1 = {foo: 'bar'}
const link2 = {foo: 'bar'}
link1 === link2 // false так как переменные ссылаются на разные объекты, хоть эти объекты и идентичны
const anotherLink1 = link1
anotherLink1 === link1 // true так как в обеих переменных ссылка на один и тот же объект