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.
typeofvalue 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 superman++; console.log(batman); //7 console.log(superman); //8
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
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 quicksilver.push(0); console.log(flash); //[8,8,8,0] console.log(quicksilver); //[8,8,8,0]
How to Create a New Reference
var firestorm = [3,6,3]; var atom = firestorm; //assign-by-reference console.log(firestorm); //[3,6,3] console.log(atom); //[3,6,3] atom = [9,0,9]; //value is reassigned (create new reference) console.log(firestorm); //[3,6,3] console.log(atom); //[9,0,9]