DEV Community

Mohammed Ali
Mohammed Ali

Posted on

Spread & Rest Operator

  • Form a new array from an existing array with less character noise.
  • Spread extracts the elements as values. Its an Immutable function.
  • [] is the way to write new arrays. Hence, spread doesn't alter the original array.
  • Spread works on all iterables, not just on arrays.
  • Iterables: String, Array, Map, Set i.e mostly builtin data structures except object data-type.
  • Difference from Destructuring: Extracts all the elements from an array, and doesn't create new variables, only used at places which require values CSVs.
  • USED when we are building an array, or when we pass values into a function.
const nums = [5,6,7];
const newNums = [1,2, nums[0],nums[1],nums[2]];
console.log(newNums); // [ 1, 2, 5, 6, 7 ]

is reduced to 

const nums = [5,6,7];
const newNums = [1,2, ...nums];
console.log(newNums); // [ 1, 2, 5, 6, 7 ]
console.log(...newNums); // 1 2 5 6 7
Enter fullscreen mode Exit fullscreen mode

1. Merge two arrays together

const arr1 = [1,2,3,4,5];
const arr2 = [6,7,8,9];

let nums = [...arr1,...arr2];
nums; // [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]


const firstname = "Peter";
const fullName = [...firstname,' ',"P."];
fullName; // [ 'P', 'e', 't', 'e', 'r', ' ', 'P.' ]

console.log(...firstname); // 'P' 'e' 't' 'e' 'r'
Enter fullscreen mode Exit fullscreen mode
  • SOURCE of ERROR: Spread operator doesn't work inside a template string as template string doesn't expect multiple values inside it.

2. Creating Shallow Copies of arrays

const girl = {
  name: 'Melania',
  friends: ['Alina', 'Alice', 'Ayesha', 'Anamika', 'Anaya']
};

const frnz = [...girl.friends];
console.log(frnz); // [ 'Alina', 'Alice', 'Ayesha', 'Anamika', 'Anaya' ]
console.log(girl.friends); // [ 'Alina', 'Alice', 'Ayesha', 'Anamika', 'Anaya' ]
Enter fullscreen mode Exit fullscreen mode

Spread works on objects also even though they are not iterables.

let male = {
  "firstName": "Gangadhar",
  "lastName": "Shaktimaan"
}

let female = {
  "firstName": "Geeta",
  "lastName": "Vishwas"
}

let x = {...male, born: 1950};
let y = {...female, born: 1940};

x; // { firstName: 'Gangadhar',   lastName: 'Shaktimaan',   born: 1950 }
y; // { firstName: 'Geeta',  lastName: 'Vishwas',  born: 1940 }```




## Shallow Copy of objects:

let male = {
  "firstName": "Gangadhar",
  "lastName": "Shaktimaan"
}

let character = {...male, firstName: 'Wonderwoman'};

male;         // { firstName: 'Gangadhar', lastName: 'Shaktimaan' }
character;    // { firstName: 'Wonderwoman', lastName: 'Shaktimaan' }

- First name for character object is changed although it was extracted from male object


Enter fullscreen mode Exit fullscreen mode

Rest Pattern & Rest Parameters:

  • Rest does the opposite of spread but has a same syntax like spread.
  • Spread was used to build new arrays or pass values to a fn. in both cases, spread was used to expand elements in both cases.
  • Rest uses the same syntax but to condense those values into a single
  • Spread is for unpacking elements from an array, rest is for packing elements into an array. ```

Difference in syntax of spread and rest operator:
Spread operator => ... are used on RHS of assignment operator.
const nums = [9,4, ...[2,7,1]];

Rest operator => ... will be on the LHS of assignment operator with destructuring
const [x,y,...z] = [9,4, 2,7,1];


## Rest syntax collects all the elements after the last elements into an array. Doesn't include any skipped elements. 
- Hence, it should be the last element in the destructuring assignment.
- There can be only one rest in any destructuring assignment.
Enter fullscreen mode Exit fullscreen mode

let diet = ['pizza', 'burger','noodles','roasted','sushi','dosa','uttapam'];

let [first, ,third, ...others] = diet;
first;
third;
others;


- Rest also works with objects. Only difference is that elements will be collected into a new object instead of an arrray.
Enter fullscreen mode Exit fullscreen mode

let days = { 'mon':1,'tue':2,'wed':3,'thu':4,'fri':5,'sat':6,'sun':7};
let {sat, sun, ...working} = days;
let off = {sat, sun};

working; // { mon: 1, tue: 2, wed: 3, thu: 4, fri: 5 }
off; // { sat: 6, sun: 7 }


- Although both look same, but they work differently based on where they are used.

Enter fullscreen mode Exit fullscreen mode

Subtle Distinction b/w Rest & Spread:

  • Spread operator is used where we would write values separated by commas
  • Rest pattern is used we would write variables names separated by commas.


Enter fullscreen mode Exit fullscreen mode

Top comments (0)