The ES6 Spread Operator is a powerful tool for any JavaScript developer to have in their toolkit. It’s a set of three dots (...
) that can be used to “spread out” the elements of an iterable object, like an array, map, set, or object.
For example, imagine you have an array of numbers called arr
that looks like this: [1, 2, 3, 4, 5]
. Instead of looping through the array and console.log
each element you can simply use the spread operator to print out the array: console.log(...arr) // 1 2 3 4 5
.
Example:
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">const</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token comment">// [ 1, 2, 3, 4, 5 ]</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token operator">...</span>arr<span class="token punctuation">)</span> <span class="token comment">// 1 2 3 4 5</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> name<span class="token punctuation">,</span> <span class="token operator">...</span>other <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'tuan'</span><span class="token punctuation">,</span> age<span class="token operator">:</span> <span class="token number">100</span><span class="token punctuation">,</span> luckyNumber<span class="token operator">:</span> <span class="token number">6</span> <span class="token punctuation">}</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span> <span class="token comment">// tuan</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>other<span class="token punctuation">)</span> <span class="token comment">// { age: 100, luckyNumber: 6 }</span> |
But the spread operator can do much more than just that! Here are some other tricks that you can use it for:
1. A better way to use the array’s push()
method
We all know that the push()
method supports passing multiple indeterminate parameters.
1 2 3 4 5 | <span class="token keyword">const</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'tuan'</span><span class="token punctuation">,</span> <span class="token string">'medium'</span> <span class="token punctuation">]</span> arr<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token operator">...</span><span class="token punctuation">[</span> <span class="token string">'JavaScript'</span><span class="token punctuation">,</span> <span class="token string">'NodeJs'</span> <span class="token punctuation">]</span><span class="token punctuation">)</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token comment">// ['tuan', 'medium', 'JavaScript', 'NodeJs']</span> |
In this example, we’re using the spread operator to spread out the elements of the array [ 'JavaScript', 'NodeJs' ]
and use the spreaded out elements as arguments to the push method, which allows us to add multiple elements to the arr
in one line instead of having to use push multiple times.
2. Copy a new array (shallow and deep clone)
Copying an array is one of the most convenient functions of the spread operator, but it’s worth noting that the spread operator only copies the array itself, not the elements. So if the original array contains objects, any changes made to the copy will also affect the original array as they refer to the same objects.
1 2 3 4 5 6 7 8 9 10 11 | <span class="token comment">// This is shallow clone</span> <span class="token keyword">const</span> originalArray <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>a<span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> b<span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">const</span> copyArr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token operator">...</span>originalArray<span class="token punctuation">]</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>copyArr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [1, 2, {a: 1, b: 2}]</span> <span class="token comment">//Modifying the object in the copyArray,</span> <span class="token comment">//it will also modify the original array</span> copyArr<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>originalArray<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [1, 2, {a: 3, b: 2}]</span> |
If you need to make a true copy of the array, including the objects inside it, you can use a deep copy function such as JSON.parse(JSON.stringify(originalArray))
, which can create a deep copy of the original array.
1 2 3 4 5 6 7 8 9 | <span class="token keyword">const</span> originalArray <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>a<span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> b<span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">const</span> copyArr <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>originalArray<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>copyArr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [1, 2, {a: 1, b: 2}]</span> <span class="token comment">//Modifying the object in the copyArray,</span> <span class="token comment">//it will not modify the original array</span> copyArr<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>originalArray<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [1, 2, {a: 1, b: 2}]</span> |
It’s important to note that JSON.parse(JSON.stringify))
creates a deep copy, but it only works for JSON-compliant data and might not be the best option in terms of performance if you’re working with large arrays. It’s also worth mentioning that the JSON.parse(JSON.stringify(originalArray))
method will not work if originalArray has a function, Symbol and undefined value
It’s also possible to use a library like Lodash or Ramda that have a cloneDeep function which can create a deep copy of an array or an object while also preserving the non JSON data type.
3. Removing duplicate values from the array
Arrays of duplicate values can be removed through the set data structure and the spread operator.
1 2 3 4 5 | <span class="token keyword">const</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'tuan'</span><span class="token punctuation">,</span> <span class="token string">'tuan'</span><span class="token punctuation">,</span> <span class="token string">'medium'</span><span class="token punctuation">,</span> <span class="token string">'medium'</span> <span class="token punctuation">]</span> <span class="token keyword">const</span> uniqueArray <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token operator">...</span><span class="token keyword">new</span> <span class="token class-name">Set</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token punctuation">]</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>uniqueArray<span class="token punctuation">)</span> <span class="token comment">// ['tuan', 'medium']</span> |
4. Connect multiple arrays
Yes, we can use the spread operator to chain multiple arrays to get brand new data.
1 2 3 4 5 6 | <span class="token keyword">const</span> arr1 <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'tuan'</span><span class="token punctuation">,</span> <span class="token string">'medium'</span> <span class="token punctuation">]</span> <span class="token keyword">const</span> arr2 <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'JavaScript'</span><span class="token punctuation">,</span> <span class="token string">'NodeJs'</span> <span class="token punctuation">]</span> <span class="token keyword">const</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token operator">...</span>arr1<span class="token punctuation">,</span> <span class="token operator">...</span>arr2 <span class="token punctuation">]</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span> <span class="token comment">// ['tuan', 'medium', 'JavaScript', 'NodeJs']</span> |
5. Convert NodeList to a real array
The spread operator can be used to convert a NodeList, which is a list of DOM elements, into a real array.
1 2 3 4 5 6 | <span class="token comment">// $divs is a NodeList</span> <span class="token keyword">const</span> $divs <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">querySelectorAll</span><span class="token punctuation">(</span><span class="token string">'div'</span><span class="token punctuation">)</span> <span class="token comment">// $arrayDivs is An Array</span> <span class="token keyword">const</span> $arrayDivs <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token operator">...</span>$divs <span class="token punctuation">]</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>$divs<span class="token punctuation">)</span><span class="token punctuation">,</span> Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>$arrayDivs<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// false true</span> |
6. Destructuring
The spread operator is often used to destructure arrays and objects, check it out!
Destructure array:
1 2 3 4 5 | <span class="token keyword">const</span> <span class="token punctuation">[</span> num0<span class="token punctuation">,</span> <span class="token operator">...</span>others <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span> <span class="token punctuation">]</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>num0<span class="token punctuation">)</span> <span class="token comment">// 1</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>others<span class="token punctuation">)</span> <span class="token comment">// [2, 3, 4, 5, 6]</span> |
Destructure object:
1 2 3 4 5 6 | <span class="token keyword">const</span> obj <span class="token operator">=</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'tuan'</span><span class="token punctuation">,</span> age<span class="token operator">:</span> <span class="token number">100</span><span class="token punctuation">,</span> luckyNumber<span class="token operator">:</span> <span class="token number">6</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> name<span class="token punctuation">,</span> <span class="token operator">...</span>other <span class="token punctuation">}</span> <span class="token operator">=</span> obj console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span> <span class="token comment">// tuan</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>other<span class="token punctuation">)</span> <span class="token comment">// { age: 100, luckyNumber: 6 }</span> |
7. Convert string to array
Isn’t it amazing that a string can be turned into an array like this?
1 2 3 | <span class="token keyword">const</span> name <span class="token operator">=</span> <span class="token string">'tuan'</span> <span class="token keyword">const</span> nameArray <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token operator">...</span>name <span class="token punctuation">]</span> <span class="token comment">// ['t', 'u', 'a', 'n']</span> |
Conclusion
The spread operator (...
) is a powerful tool that can simplify your code and make it more efficient. It allows you to expand the elements of an iterable object, such as an array, set, map, or object. It can be used for tasks like merging arrays, copying arrays, removing duplicates, destructure arrays and objects, and converting NodeList or string to array.
However, it is important to note that it creates a shallow copy, meaning that any changes made to the copied array will affect the original. Therefore, when necessary, you should use other methods to create a deep copy such as JSON.parse(JSON.stringify(originalArray))
or library like lodash or Ramda.
And Finally
As always, I hope you enjoyed this article and learned something new.
Thank you and see you in the next articles!
If you liked this article, please give me a like and subscribe to support me. Thank you.