Cloning an Object with Lodash
Lodash's clone() function is a powerful utility for shallow cloning generic objects. The Object.assign() function or the spread operator are the canonical methods for shallow copying a POJO. But _.clone() has some additional functionality built in that may make it a better choice for your use case.
Cloning an Array
Object.assign() and _.clone() behave similarly when
copying a plain old JavaScript object (POJO). But what
about cloning an array?
const arr = ['a', 'b', 'c'];
// `Object.assign()` will copy all the array properties
// into a POJO
Object.assign({}, arr); // { '0': 1, '1': 2, '2': 3 }
// But `_.clone()` is smart enough to clone an array
_.clone(arr); // ['a', 'b', 'c']
Cloning an Instance of a Class
Another benefit of _.clone() is that the cloned object
will have the same ES6 class as the original object. The Object.assign() function always returns a POJO.
class MyClass {
constructor(val) {
this.val = val;
}
}
const obj = new MyClass(42);
// `Object.assign()` **always** returns a POJO. It
// doesn't actually create a new instance of the class.
Object.assign({}, obj) instanceof MyClass; // false
// `_.clone()` retains the original object's class.
_.clone(obj) instanceof MyClass; // true
Takeaways
If you need to clone a POJO, you don't need Lodash. Just use
{...obj} or Object.assign({}, obj). But _.clone() is
handy if you find yourself needing to clone class instances,
or just want to be able to clone an arbitrary object without
checking whether it is an array.