DEV Community

Cover image for Mastering JavaScript: Copy Items like a Pro with These Simple Tips!
Christopher Glikpo  ⭐
Christopher Glikpo ⭐

Posted on

Mastering JavaScript: Copy Items like a Pro with These Simple Tips!

JavaScript provides several ways to copy arrays and objects, but the process can be tricky and error-prone if you're not familiar with the language. Whether you're working with large datasets, nested objects, or complex data structures, mastering the art of copying items in JavaScript is essential for efficient and error-free programming. In this article, we'll cover some simple tips to help you copy items like a pro.

1. Shallow Copy

A shallow copy creates a new object or array that has the same properties as the original, but the properties themselves are not duplicated. In other words, the new object or array contains references to the same properties as the original. To make a shallow copy of an array or object, you can use the spread operator.

const originalArray = [1, 2, 3, 4, 5];
const newArray = [...originalArray];
Enter fullscreen mode Exit fullscreen mode

In this example, we're using the spread operator to create a shallow copy of the originalArray. The newArray contains the same elements as the originalArray, but they are not duplicated.

2. Deep Copy

A deep copy creates a new object or array that has the same properties as the original, but the properties themselves are also duplicated. In other words, the new object or array contains completely separate copies of the properties. To make a deep copy of an array or object, you can use the JSON.parse() and JSON.stringify() methods.

const originalObject = { name: 'John', age: 30 };
const newObject = JSON.parse(JSON.stringify(originalObject));
Enter fullscreen mode Exit fullscreen mode

In this example, we're using the JSON.parse() and JSON.stringify() methods to create a deep copy of the originalObject. The newObject contains separate copies of the properties name and age.

3. Slice Method

The slice() method creates a new array that contains a portion of the original array. This method is commonly used to make a shallow copy of an array.

const originalArray = [1, 2, 3, 4, 5];
const newArray = originalArray.slice();
Enter fullscreen mode Exit fullscreen mode

In this example, we're using the slice() method to create a shallow copy of the originalArray. The newArray contains the same elements as the originalArray, but they are not duplicated.

4. Object.assign Method

The Object.assign() method copies the values of all enumerable properties from one or more source objects to a target object. This method is commonly used to make a shallow copy of an object.

const originalObject = { name: 'John', age: 30 };
const newObject = Object.assign({}, originalObject);
Enter fullscreen mode Exit fullscreen mode

In this example, we're using the Object.assign() method to create a shallow copy of the originalObject. The newObject contains the same properties as the originalObject, but they are not duplicated.

It's important to note that when you're copying nested objects or arrays, you may need to use a combination of these techniques to create a deep copy. Also, if you're working with large datasets, deep copying can be resource-intensive, so be mindful of your program's performance.

In conclusion, copying items in JavaScript is a crucial skill for any programmer. By mastering these simple techniques, you can efficiently copy items like a pro, whether you're working with large datasets or complex data structures. Remember to choose the technique that's most appropriate for your specific situation, and always test your code to ensure that it's working as expected.

Top comments (5)

Collapse
 
mathijsco profile image
Mathijs

You can also use the spread operator for objects to create a shallow copy.
const newObject = { ...oldObject };

Any advantages in using Object.assign vs the spread operator?

Collapse
 
wizdomtek profile image
Christopher Glikpo ⭐

Yes, there are some advantages to using Object.assign() over the spread operator (...) in certain situations:

  1. Copying non-enumerable properties: Object.assign() can copy non-enumerable properties of an object, while the spread operator cannot. Non-enumerable properties are those that cannot be iterated over using a for...in loop. If you need to copy non-enumerable properties, you should use Object.assign().

  2. Merging multiple objects: *Object.assign() * can merge multiple objects into a single object, while the spread operator only copies properties from a single object at a time. This can be useful when you need to combine properties from several objects into a single object.

  3. Updating an existing object: Object.assign() can also be used to update the properties of an existing object. When you pass an existing object as the first argument to Object.assign(), it will update the properties of that object with the properties of the other objects that you pass as arguments. This can be useful when you want to update an object with new properties without overwriting any existing properties.

  4. Internet Explorer compatibility: Object.assign() is supported in Internet Explorer 11 and newer versions, while the spread operator is not. If you need to support Internet Explorer 11 or older browsers, you should use** Object.assign()** instead of the spread operator.

In summary, while the spread operator is often more concise and easier to read, Object.assign() has some advantages in certain situations, such as copying non-enumerable properties, merging multiple objects, updating an existing object, and ensuring compatibility with older browsers.

Collapse
 
mathijsco profile image
Mathijs

Thanks for sharing!
I use the spread operator a lot actually for objects in React and TypeScript. Luckily IE11 is no longer needed to support and developing in React requires to program with immutable patterns. I did not know that it should be enumerable, but never encountered problems with that.

Regarding number 2, you can combine multiple objects properties.
const c = { ...a, ...b } to merge two objects and create a new clone.
const c = { ...a, overridePropertyA: "other value" } to use a as default values and override a single property.
const c = { propertyA: "default value", ...a } to have a default value for propertyA and if also available in a, override it with that newer value.

Collapse
 
billigsteruser profile image
BilligsterUser
Collapse
 
wizdomtek profile image
Christopher Glikpo ⭐

Thanks for sharing