This article was originally published on Medium.
The following terms are used throughout the article:
scalar – a singe value or unit of data (e.g. integer, boolean, string)
compound – comprised of multiple values (e.g. array, object, set)
primitive – a direct value, as opposed to a reference to something that contains the real value.
The typeof value assigned to a variable decides whether the value is stored with assign-by-value or assign-by-reference.
On variable assignment, the scalar primitive values (Number, String, Boolean, undefined, null, Symbol) are assigned-by-value and compound values are assigned-by-reference.
Quick Example of Assign-by-Value:
In the code snippet below, we are assigning a scalar primitive value (a number) to a variable and thus assign-by-value applies here. Firstly, the variable batman is initialized and when the variable superman is assigned with the value stored in batman, it creates a new copy of the value and stores it. When the variable superman is modified, batman is left unaffected, as they point to distinct values.
var batman = 7;
var superman = batman; //assign-by-value
Quick Example of Assign-by-Reference:
In the code snippet below, we are assigning a compound value (an array) to a variable and thus assign-by-reference applies here. The variables flash and quicksilver are references to the same value (aka shared value). The references will point to the updated value when the shared value is modified .
var flash = [8,8,8];
var quicksilver = flash; //assign-by-reference
How to Create a New Reference
var firestorm = [3,6,3];
var atom = firestorm; //assign-by-reference
atom = [9,0,9]; //value is reassigned (create new reference)