<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: deepak-negi-web</title>
    <description>The latest articles on DEV Community by deepak-negi-web (@deepaknegiweb).</description>
    <link>https://dev.to/deepaknegiweb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F356198%2Fbb789c9a-dbf7-48b5-8332-5fa88da4e258.jpg</url>
      <title>DEV Community: deepak-negi-web</title>
      <link>https://dev.to/deepaknegiweb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deepaknegiweb"/>
    <language>en</language>
    <item>
      <title>ES6: How to Clone an Object in javascript ?</title>
      <dc:creator>deepak-negi-web</dc:creator>
      <pubDate>Wed, 19 Jan 2022 21:03:34 +0000</pubDate>
      <link>https://dev.to/deepaknegiweb/es6-how-to-clone-an-object-in-javascript--5dej</link>
      <guid>https://dev.to/deepaknegiweb/es6-how-to-clone-an-object-in-javascript--5dej</guid>
      <description>&lt;p&gt;Hey Folks👋 hope you doing well.&lt;br&gt;
So you must be thinking, "Clone an Object"??? whats the big deal?&lt;br&gt;
Well, i also think this way until i encounter an issue which took me 2 days just to debug that i have done something terrible with cloning an object.&lt;/p&gt;

&lt;p&gt;So lets see how can we clone objects in javascript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// we have a user object
const user = {
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com"
} 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if we want to copy this user object, so? simple!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const copiedUser = user;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Easy right?... well thats the worst way of copying a user,it is clear that you have some misconceptions of what the statement &lt;code&gt;const copiedUser = user;&lt;/code&gt; does.&lt;/p&gt;

&lt;p&gt;In JavaScript objects are passed and assigned by reference (more accurately the value of a reference), so &lt;code&gt;user&lt;/code&gt; and &lt;code&gt;copiedUser&lt;/code&gt; are both references to the same object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// [Object1]&amp;lt;--------- user

const copiedUser = user;

// [Object1]&amp;lt;--------- user
//         ^ 
//         |
//         ----------- copiedUser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see after the assignment, both references are pointing to the same object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const user = {
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com"
}  
const copiedUser = user;
copiedUser.name = "XYZ"
console.log(copiedUser) // {name:"XYZ",email:"st.deepak15@gmail.com"}
console.log(user) // {name:"XYZ",email:"st.deepak15@gmail.com"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;modifing any of them will change both of them :(&lt;/p&gt;

&lt;p&gt;So then how we can create copy if we need to modify one and not the other?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Spread Operator&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const spreadUser = {...user}
spreadUser.name = "XYZ"
console.log(spreadUser) // {name:"XYZ",email:"st.deepak15@gmail.com"}
console.log(user) // {name:"Deepak Negi",email:"st.deepak15@gmail.com"}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Object.assign()&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const assignUser = Object.assign({}, user);
assignUser.name = "XYZ"
console.log(assignUser) // {name:"XYZ",email:"st.deepak15@gmail.com"}
console.log(user) // {name:"Deepak Negi",email:"st.deepak15@gmail.com"}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yaassss we finally got it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftenor.com%2Fview%2Fconfetti-party-yay-sexy-celebrate-gif-5509359" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftenor.com%2Fview%2Fconfetti-party-yay-sexy-celebrate-gif-5509359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you think thats it.. so no... there much more to know, now we have added some more data in the user object and now lets see what happen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const user = {
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com",
  address:{
    line1:"ABC, Tower X",
    city:"New Delhi",
    state:"Delhi",
    zipcode: 000000,
    country:"India"
  }
}
const spreadUser = {...user}
spreadUser.address.city = "Pune"
spreadUser.address.state = "Mumbai"

console.log(spreadUser)
// console output 
{
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com",
  address:{
    line1:"ABC, Tower X",
    city:"Pune",
    state:"Mumbai",
    zipcode: 000000,
    country:"India"
  }
}

console.log(user)
// console output 
{
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com",
  address:{
    line1:"ABC, Tower X",
    city:"Pune",
    state:"Mumbai",
    zipcode: 000000,
    country:"India"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You see the problem, our actual user object is also changed now and this happens with &lt;code&gt;Object.assign()&lt;/code&gt; method as well.&lt;/p&gt;

&lt;p&gt;But why?&lt;br&gt;
Because of the &lt;strong&gt;shallow copying&lt;/strong&gt; i.e. object spread operator, as well as Object.assign, does not clone the values of nested objects, but copies the reference to the nested object. That's called &lt;strong&gt;shallow copying&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then what should we do? Deep copy?&lt;br&gt;
Yes, Deep copy/Deep clone will copies object, even nested properties, to do so serialize the object to JSON and parse it back to a JS object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const user = {
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com",
  address:{
    line1:"ABC, Tower X",
    city:"New Delhi",
    state:"Delhi",
    zipcode: 000000,
    country:"India"
  }
}
const deepCopiedUser = JSON.parse(JSON.stringify(user))

deepCopiedUser.address.city = "Pune"
deepCopiedUser.address.state = "Mumbai"

console.log(deepCopiedUser)
// console output 
{
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com",
  address:{
    line1:"ABC, Tower X",
    city:"Pune",
    state:"Mumbai",
    zipcode: 000000,
    country:"India"
  }
}

console.log(user)
// console output 
{
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com",
  address:{
    line1:"ABC, Tower X",
    city:"New Delhi",
    state:"Delhi",
    zipcode: 000000,
    country:"India"
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So now our original &lt;code&gt;user&lt;/code&gt; object doesn't change when we modify the &lt;code&gt;deepCopiedUser&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Beware using the &lt;code&gt;JSON.parse(JSON.stringify(user))&lt;/code&gt; if you're dealing with date, functions, RegExps, Maps, Sets or other complex types within your object. The JSON method can't handle these types.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So for such cases the &lt;a href="https://lodash.com/docs/4.17.15#cloneDeep" rel="noopener noreferrer"&gt;&lt;strong&gt;lodash clonedeep&lt;/strong&gt;&lt;/a&gt; method is probably the best way to go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import {cloneDeep} from 'lodash'
or
const {cloneDeep} = require('lodash')

const user = {
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com",
  address:{
    line1:"ABC, Tower X",
    city:"New Delhi",
    state:"Delhi",
    zipcode: 000000,
    country:"India"
  }
}
const deepCloneUser = cloneDeep(user)
deepCloneUser.address.city = "Pune"
deepCloneUser.address.state = "Mumbai"

console.log(deepCloneUser)
// console output 
{
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com",
  address:{
    line1:"ABC, Tower X",
    city:"Pune",
    state:"Mumbai",
    zipcode: 000000,
    country:"India"
  }
}

console.log(user)
// console output 
{
  name:"Deepak Negi",
  email:"st.deepak15@gmail.com",
  address:{
    line1:"ABC, Tower X",
    city:"New Delhi",
    state:"Delhi",
    zipcode: 000000,
    country:"India"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally!!&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftenor.com%2Fview%2Fdone-well-gif-18074129" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftenor.com%2Fview%2Fdone-well-gif-18074129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know in the comment what do you think the best way for deep cloning the object.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
