Javascript: Pass By Reference Or By Value?
Is Javascript pass by reference or pass by value? In fact, it’s a little bit of both. Primitives: null, undefined, Number, String, & Boolean are pass by value, and Objects: Array, Function, & Objects are pass by reference. Unsure what we mean? Let’s check some examples with comments to see exactly!
// Primitives won't get changed, because we copy (pass) the value
// so the underlying value won't get changed
let a = 1;
let b = a;
a = 5;
console.log(a); // 5
console.log(b); // 1
// we copy by reference meaning when we assign b to a we copy the location in memory
// meaning the underlying object will get changed
let a = {};
let b = a;
a.foo = 'bar';
console.log(a); // {foo: "bar"}
console.log(b); // {foo: "bar"}
// same is true for arrays, the underlying array will get changed
let z = [];
let x = z;
z.push('apple');
console.log(z); // ["apple"]
console.log(x); // ["apple"]
Javascript functions also behave similarly:
// functions can change the object without even returning the object because
// it is changing the same referenced object
function changeGrade(student) {
student.math = 'A';
}
let student = {
math: 'F',
history: 'B'
};
changeGrade(student);
console.log(student); // {math: "A", history: "B"}
// A boolean is a primitive so it is passed by value so will not get
// changed when passed to a function
function primitiveUnchanged(didPass) {
didPass = true;
}
let didPass = false;
primitiveUnchanged(didPass);
console.log(didPass); // false
A couple of good overviews can be found on: