DEV Community

Matsu
Matsu

Posted on • Updated on

Exploring Object Cloning Techniques in JavaScript

Cloning objects is a common task in JavaScript, and luckily, there are multiple ways to achieve it. Let's dive into three popular methods: the Spread Operator (...), Object.assign(), and Object.create(). Additionally, we'll explore the powerful cloneDeep method from the Lodash library for deep cloning.

1. Spread Operator: The Elegant Unpacker
The spread operator (...) is a concise and expressive way to clone objects. It creates a shallow copy, meaning nested objects are still referenced.
Example:

const originalObject = { name: 'John', age: 30 };
const clonedObject = { ...originalObject };

console.log(clonedObject); // { name: 'John', age: 30 }
Enter fullscreen mode Exit fullscreen mode

2. Object.assign(): The Old Reliable
Object.assign() is a versatile method for object cloning and merging. Like the spread operator, it performs a shallow copy.
Example:

const originalObject = { name: 'Alice', city: 'Wonderland' };
const clonedObject = Object.assign({}, originalObject);

console.log(clonedObject); // { name: 'Alice', city: 'Wonderland' }
Enter fullscreen mode Exit fullscreen mode

3. Object.create(): The Prototypal Pioneer
Object.create()not only clones an object but also allows you to set the prototype of the new object explicitly. It creates a new object with the specified prototype object and properties.
Example:

const prototypeObject = { role: 'user' };
const clonedObject = Object.create(prototypeObject);

console.log(clonedObject); // {}
console.log(clonedObject.role); // 'user'
Enter fullscreen mode Exit fullscreen mode

Example with the spread operator to demonstrate how changes to a nested object affect both the original and cloned variables:

const originalObject = { 
  name: 'John', 
  details: { 
    age: 30, 
    city: 'Metropolis' 
  } 
};

// Using the spread operator to create a shallow copy
const clonedObject = { ...originalObject };

console.log('Original Object:', originalObject);
console.log('Cloned Object:', clonedObject);

// Modifying a nested object property
clonedObject.details.age = 31;

console.log('--- After Modifying Cloned Object ---');
console.log('Original Object:', originalObject);
console.log('Cloned Object:', clonedObject);

// Results:
/*
Original Object: { name: 'John', details: { age: 30, city: 'Metropolis' } }
Cloned Object: { name: 'John', details: { age: 30, city: 'Metropolis' } }
--- After Modifying Cloned Object ---
Original Object: { name: 'John', details: { age: 31, city: 'Metropolis' } }
Cloned Object: { name: 'John', details: { age: 31, city: 'Metropolis' } }
*/
Enter fullscreen mode Exit fullscreen mode

This code demonstrates that changes to the nested object within the clonedObject also affect the originalObject due to the shallow copy created by the spread operator.

So if you want to clone even the nested objects and arrays, you can use the Lodash's cloneDeep.


4. Lodash's cloneDeep: The Deep Cloner
Lodash provides a powerful utility function called cloneDeep for deep cloning objects, including nested objects and arrays.
Example:

const lodash = require('lodash');

const originalObject = { name: 'Eve', hobbies: ['reading', 'coding'] };
const deepClonedObject = lodash.cloneDeep(originalObject);

console.log(deepClonedObject); // { name: 'Eve', hobbies: ['reading', 'coding'] }
Enter fullscreen mode Exit fullscreen mode

Each method has its strengths, so the choice depends on your specific requirements. The spread operator and Object.assign() are excellent for simple cloning tasks, while Object.create() provides more control over the prototype chain. For deep cloning and immutability, Lodash's cloneDeep is a valuable addition to your toolkit.

  • Shallow vs. Deep Copy: Keep in mind that the spread operator and Object.assign() create shallow copies. If your object contains nested objects, changes in the nested objects will affect both the original and cloned objects.
  • Immutable Libraries: For deep cloning and immutability, consider using external libraries like Lodash's cloneDeep method.

Mastering different object cloning techniques gives you flexibility in managing your JavaScript objects. Whether you need a shallow copy for simple scenarios, a more intricate prototype setup, or deep cloning capabilities, these methods and libraries have you covered.

Console You Later!

Top comments (0)