Како доћи до референци у односу на вредност у ЈаваСцрипт-у

Овај чланак говори о понашању различитих типова података ЈаваСцрипт када су додељени променљивој. У зависности од типа података, меморија се различито додељује за њено чување. Може резервисати нови простор за чување копије вредности, или можда уопште неће створити копију и само указати на постојећу вредност (референцу).

Ево мојих белешки које је водио Вес Бос током курса Јавасцрипт30.

Бројеви, низови и логичке вредности

У ЈаваСцрипт, Основни типови као што су undefined, null, string, number, booleanи symbolдоносе вредности.

let name = ‘Marina’;let name2 = name;
console.log({name, name2}); >> { name: ‘Marina’, name2: ‘Marina’ }
name = ‘Vinicius’;
console.log({name, name2});>> { name: ‘Vinicius’, name2: ‘Marina’ }

Када је променљива nameдодељена, простор у меморији са адресом од 0x001је резервисан за чување те вредности. Затим променљива nameпоказује на ту адресу. Тада је променљива name2подешена на једнако name. Додељује се нови простор у меморији са новом адресом 0x002и чува копију вредности ускладиштене на адреси на коју nameупућује.

Дакле, кад год желимо да изменимо вредност name, вредност која се чува name2неће се променити, јер је њена копија, ускладиштена на другом месту.

Објекти и низови

Објекти у ЈаваСцрипт-у се прослеђују референцом. Када је постављено више од једне променљиве за чување или object, arrayили function, те променљиве ће указивати на исти додељен простор у меморији.

const animals = ['Cat', 'Dog', 'Horse', 'Snake'];
let animals2 = animals;console.log({animals, animals2});>>{ animals: ['Cat', 'Dog', 'Horse', 'Snake'], animals2: ['Cat', 'Dog', 'Horse', 'Snake']}
animals2[3] = 'Wale';console.log(animals, animals2);>>{ animals: ['Cat', 'Dog', 'Horse', 'Wale'], animals2: ['Cat', 'Dog', 'Horse', 'Wale']}

Када animalsсе постави за чување низа, додељује се меморија и адреса се придружује тој променљивој. Тада animals2је постављено на једнако animals. Будући да animalsскладишти низ, уместо да креира копију тог низа и нову адресу у меморији, animals2једноставно се указује на исти објекат на постојећој адреси. На тај начин animals2ће се рефлектовати све промене направљене на њима animals, јер указују на исто место.

Видећете исто понашање за објекте:

const person = { name: 'Marina', age: 29};
let femme = person;femme.age = 18;
console.log({person, femme});>>{ person: { name: 'Marina', age: 18 }, femme: { name: 'Marina', age: 18 }}

Копирање објеката и низова

С обзиром да једноставан задатак није довољан да би се произвела копија објекта, то се може постићи другим приступима:

Низови

слице ()

let animals2 = animals.slice();animals2[3] = 'Shark';

цонцат ()

let animals3 = [].concat(animals);animals3[3] = 'Tiger';

ширење (ЕС6)

let animals4 = [...animals];animals4[3] = 'Lion';

Промене ће утицати само на модификовани објекат:

console.log({animals, animals2, animals3, animals4});>>{ animals: ['Cat', 'Dog', 'Horse', 'Snake'], animals2: ['Cat', 'Dog', 'Horse', 'Shark'], animals3: ['Cat', 'Dog', 'Horse', 'Tiger'], animals4: ['Cat', 'Dog', 'Horse', 'Lion']}

Предмети

доделити ()

let human = Object.assign({}, person, { age: 20 });
console.log(person, human);>>{ person: { name: 'Marina', age: 29 }, human: { name: 'Marina', age: 20 }}

Дееп Цлоне

Важно је напоменути да су те методе дубоке само један ниво. За дубоке клонове постоји намргођена метода. Користите пажљиво.

let femme3 = JSON.parse(JSON.stringify(person));femme3.name = 'Leslie';
console.log(person, femme3);>>{ person: { name: 'Marina', age: 29 }, femme3: { name: 'Leslie', age: 29 }}

Референце

  • ВесБос - Јавасцрипт 30
  • Не знате ЈС: Опсег и затварање, Киле Симпсон

Првобитно објављено на марина-ферреира.гитхуб.ио.