Πώς καταλαβαίνεις τι είναι η μεταβίβαση με αναφορά;
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 }, το αρχικό αντικείμενο δεν άλλαξε