Sobes.tech
Junior

Πώς καταλαβαίνεις τι είναι η μεταβίβαση με αναφορά;

sobes.tech AI

Απάντηση από AI

Στο JavaScript, οι primitive τύποι δεδομένων (αλυσίδες, αριθμοί, boolean τιμές, null, undefined, Symbol, BigInt) περνούν με τιμή. Αυτό σημαίνει ότι κατά την ανάθεση ή την περασμένη σε μια συνάρτηση, αντιγράφεται η ίδια η τιμή.

Τα αντικείμενα (συμπεριλαμβανομένων των πινάκων και των συναρτήσεων) περνούν και αντιγράφονται με αναφορά. Στην πραγματικότητα, αντιγράφεται όχι το αντικείμενο, αλλά η αναφορά στη μνήμη όπου αυτό αποθηκεύεται.

// Μεταβίβαση με τιμή
let a = 10;
let b = a; // Αντιγράφεται η τιμή 10
b = 20;
console.log(a); // 10, η αλλαγή στο 'b' δεν επηρεάζει το 'a'

// Μεταβίβαση με αναφορά
let obj1 = { value: 10 };
let obj2 = obj1; // Αντιγράφεται η αναφορά στο αντικείμενο
obj2.value = 20;
console.log(obj1.value); // 20, οι αλλαγές μέσω του 'obj2' επηρεάζουν το 'obj1' επειδή δείχνουν στο ίδιο αντικείμενο

Όταν περνάμε ένα αντικείμενο σε μια συνάρτηση, η συνάρτηση λαμβάνει ένα αντίγραφο της αναφοράς. Οι αλλαγές στις ιδιότητες του αντικειμένου μέσα στη συνάρτηση θα επηρεάσουν το αρχικό αντικείμενο, επειδή η αναφορά είναι η ίδια. Ωστόσο, αν μέσα στη συνάρτηση ανατεθεί ένα νέο αντικείμενο στη μεταβλητή, το αρχικό αντικείμενο θα παραμείνει αμετάβλητο, επειδή η αναφορά θα δείχνει σε άλλη περιοχή μνήμης.

function modifyObject(obj) {
  obj.newValue = 30; // Αλλάζει το αρχικό αντικείμενο
}

function assignNewObject(obj) {
  obj = { anotherValue: 40 }; // Η μεταβλητή 'obj' μέσα στη συνάρτηση δείχνει τώρα σε νέο αντικείμενο
}

let myObject = { initialValue: 10 };
modifyObject(myObject);
console.log(myObject); // { initialValue: 10, newValue: 30 }

let anotherObject = { initialValue: 10 };
assignNewObject(anotherObject);
console.log(anotherObject); // { initialValue: 10 }, το αρχικό αντικείμενο δεν άλλαξε