Value vs Reference Explanation
Let's re-write the example from our last lecture:
const person = { firstName: 'Jon', lastName: 'Snow', } const otherPerson = person; person.firstName('JOHNNY'); console.log(person); // { firstName: 'JOHNNY', lastName: 'Snow' } console.log(otherPerson); // { firstName: 'JOHNNY', lastName: 'Snow' }
So.... what happened here? Well...
When a variable is assigned a primitive value, it just copies that value. We saw that with number and strings examples.
On the other hand, when a variable is assigned a non-primitive value (such as an object, an array or a function), it is given a reference to that object’s location in memory. What does that mean?
In this example above, the variable otherPerson
doesn’t actually contain the value { firstName: 'Jon', lastName: 'Snow' }
, instead it points to a location in memory where that value is stored.
const otherPerson = person;
When a reference type value is copied to another variable, like otherPerson
in the example above, the object is copied by reference instead of value. In simple terms, person
& otherPerson
don’t have their own copy of the value. They point to the same location in memory.
person.firstName('JOHNNY'); console.log(person); // { firstName: 'JOHNNY', lastName: 'Snow' } console.log(otherPerson); // { firstName: 'JOHNNY', lastName: 'Snow' }
When a new item is pushed to person
, the array in memory is modified, and as a result the variable otherPerson
also reflects that change.
We're never actually making a copy of a person
object. We're just make a variable that points to the same location in the memory.
Equality
We can prove that with a simply equality check.
const person = { firstName: 'Jon' }; const otherPerson = { firstName: 'Jon' }; console.log(person === otherPerson);
What do you think? Are person
and otherPerson
equal? Well, they should be, right? They look exactly the same, have the same keys and values. Let's check it out:
console.log(person === otherPerson); // FALSE
You might expect person === otherPerson
to resolve to true but that isn’t the case. The reason behind that is that although person
& otherPerson
contain identical objects, they still point to two distinct objects stored in different locations in memory.
Now, let's create a copy of the person
object by copying the object itself, rather than creating a completely new instance of it.
const anotherPerson = person; console.log(person === anotherPerson); // TRUE
person
& anotherPerson
hold reference to the same location in memory & are therefore considered to be equal.
Awesome! We just learned that primitive values are copied by value, and that objects are copied by reference.
In the next lecture, we're going to learn how to make a real copy of an object. That will allow us to copy an object and change it without being afraid that we'll change both objects at the same time.