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-й случай.

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,

Другие вопросы по тегам