Javascript двусторонняя ссылка проблема - PullRequest
0 голосов
/ 03 октября 2018

Я очень озадачен ссылками на Javascript.Я понимаю, что при ссылке на объект, есть ссылка сделана.Смена родительского элемента приводит к изменению копии, и наоборот.

Что меня смущает, так это то, что когда изменения в назначении вносятся в родительский объект, копия сохраняет все.См. Мой пример

let tester = {
  "hello": "how are you",
  "myArrayHere": [
    { "id": 1, "name": "me" },
    { "id": 2, "name": "you" },
    { "id": 3, "name": "them" },
  ]
};

var something = tester.myArrayHere.find(x => x.name === "you");

console.log(something);
console.log("--------");

something.id = 99;
console.log(something);
console.log("--------");

console.log(tester.myArrayHere[1]);
console.log("--------");

tester.myArrayHere[1].id = 88;

console.log(something);
console.log("--------");

tester.myArrayHere[1] = {};
console.log(tester.myArrayHere[1]);
console.log("--------");

console.log(something)

Если вы запустите этот пример, something в последней строке по-прежнему будет иметь весь объект, даже если двумя строками выше, его ссылка была переназначена.

Существуют и другие примеры этого, например, когда вы удаляете вещи из родительского объекта и т. Д. Если это чисто ссылка, а не копия (например, с примитивными типами), почему эти изменения не влияют на него должным образом?

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Пожалуйста, проверьте объяснение во фрагменте

let tester = { // tester is a link to a object (not an object itself) in memory
  "hello": "how are you",
  "myArrayHere": [ // tester.myArrayHere is a link to a object (not an object itself) in memory
    { "id": 1, "name": "me" },
    { "id": 2, "name": "you" }, // tester.myArrayHere[1] is a link to a object (not an object itself) in memory
    { "id": 3, "name": "them" },
  ]
};

var something = tester.myArrayHere.find(x => x.name === "you"); // something now is the same link to the object { "id": 2, "name": "you" }, but not an object itself tester.myArrayHere[1] will be === something link is eqaul to link

console.log(something);
console.log("--------");

something.id = 99;
console.log(something);
console.log("--------");

console.log(tester.myArrayHere[1]);
console.log("--------");

tester.myArrayHere[1].id = 88;

console.log(something);
console.log("--------");

tester.myArrayHere[1] = {}; // now tester.myArrayHere[1] becomes a link to a new object, { "id": 2, "name": "you" } is still in a memory and something is link to it
console.log(tester.myArrayHere[1]);
console.log("--------");

console.log(something)
0 голосов
/ 03 октября 2018

Лучше всего представить код, который вы разместили, как "имеющий прямой ярлык к вложенному полю"

const joe = {    // (A) joe is an object
  id: 42,
  name: 'joe',
  hobbies: [     // (B) hobbies is an Array, a reference type
    'surfing',
    'videogames'
  ]
}

// (C) this variable has no idea that it is part of person object from (A)
const cloneHobbies = joe.hobbies
cloneHobbies.push('boxing') 

console.log('***JOE***', joe) // Joe now has a new hobby: boxing

// It also works the other way; Joe's hobbies become someone else's 
joe.hobbies.push('karate')

console.log("***CLONE'S HOBBIES***", cloneHobbies) // now has 'karate'

Надеюсь, это поможет вам осмыслить код.Cheers,

0 голосов
/ 03 октября 2018

Переменная something просто ссылается на (предварительно определенный) объект, сохраненный в памяти.Это значение является возвращаемым значением ( ссылка на объект) метода Array#find.Переменные не отслеживают какой-либо конкретный путь (например, tester.myArrayHere[1]), они не наблюдатели .Другими словами, в этом случае интерпретатор JavaScript не заботится / не помнит как получить объект / значение до назначения.

> var a, b; a = b = {};
> a === b
true
> a = {}
> a === b
false

После выполнения tester.myArrayHere[1] = {};, второйэлемент массива ссылается на новый объект .Переменная something все еще относится к старого объекта .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...