JS функция "Глубокое сравнение". Сравнение объектов
Я хотел реализовать функцию JS "Глубокое сравнение" и натолкнуться на одну интересную особенность.
1-й случай -
var arrValuesObjA = [{ is: "an" }, 2];
var arrValuesObjB = [{ is: "an" }, 2];
console.log(Array.isArray(arrValuesObjA), arrValuesObjA);
//true Array [ {…}, 2 ] // 0: Object { is: "an" } 1: 2 length: 2
console.log(Array.isArray(arrValuesObjB), arrValuesObjB);
// true Array [ {…}, 2 ] // 0: Object { is: "an" } 1: 2 length: 2
for (let i = 0; i < arrValuesObjA.length; i++) {
console.log(arrValuesObjA[i] === arrValuesObjB[i]);
// First iteration - false, second iteration - true.
// Means Object { is: "an" } from arrValuesObjA[0] don't equal to Object { is: "an" } from arrValuesObjB[0] !!!
}
2-й случай -
let objA = {here: {is: "an"}, object: 2}, objB = {here: {is: "an"}, object: 2};
var arrKeysObjA = Object.keys(objA);
var arrKeysObjB = Object.keys(objB);
var arrValuesObjA = [];
var arrValuesObjB = [];
for (let i = 0; i < arrKeysObjA.length; i++) {
arrValuesObjA.push( objA[ arrKeysObjA[i] ] );
}
for (let i = 0; i < arrKeysObjB.length; i++) {
arrValuesObjB.push( objA[ arrKeysObjB[i] ] );
}
console.log(Array.isArray(arrValuesObjA), arrValuesObjA);
// true Array [ {…}, 2 ] // 0: Object { is: "an" } 1: 2 length: 2 // the same as in 1st case!
console.log(Array.isArray(arrValuesObjB), arrValuesObjB);
// true Array [ {…}, 2 ] // 0: Object { is: "an" } 1: 2 length: 2 // the same as in 1st case!
for (let i = 0; i < arrKeysObjA.length; i++) {
console.log(arrValuesObjA[i] === arrValuesObjB[i]);
// First iteration - true!!!, second iteration - true.
// Means Object { is: "an" } from arrValuesObjA[0] equal to Object { is: "an" } from arrValuesObjB[0] !!!
}
В 1-ом случае Object { is: "an" } из arrValuesObjA[0] не равен Object { is: "an" } из arrValuesObjB[0], но во 2-м случае они равны.
Кто-нибудь может объяснить, что происходит? Я думаю, что это как-то связано с копией по значению и копией по ссылке, но я не уверен.
1 ответ
Решение
for (let i = 0; i < arrKeysObjA.length; i++) {
arrValuesObjA.push( objA[ arrKeysObjA[i] ] );
}
for (let i = 0; i < arrKeysObjB.length; i++) {
arrValuesObjB.push( objA[ arrKeysObjB[i] ] );
}
Посмотрите внимательно в обоих случаях выше вы используете objA
,