Copy an Array in JavaScript
There are several easy ways to clone an array in JavaScript. You can use the Array#slice()
method, or the spread operator.
const arr = ['hello', 'world'];
// Clone using `slice()`
const arr2 = arr.slice();
arr2; // ['hello', 'world']
arr2 === arr; // false
// Clone using spread operator `...`
const arr3 = [...arr];
arr2; // ['hello', 'world']
arr2 === arr; // false
Two other common approaches are by concat()
-ing the array to an empty array and by using the map()
method:
// Clone using `concat()`
const arr4 = [].concat(arr);
arr4; // ['hello', 'world']
arr4 === arr; // false
// Clone using `map()`
const arr5 = arr.map(v => v);
arr5; // ['hello', 'world']
arr5 === arr; // false
These 4 approaches for copying an array are effectively identical and there isn't much reason to prefer one over
the other. The most significant difference is that slice()
enjoys slightly better browser support - all the
way back to Internet Explorer 4.
Deep Copy vs Shallow Copy
Keep in mind that all 4 of the above approaches create a shallow clone of the array. In other words, they clone the array itself, but not the array elements.
This difference doesn't matter when you have an array of primitives (numbers, strings, null
, undefined
), but
it does when you have an array of objects.
const arr = [{ answer: 42 }];
const arr2 = arr.slice();
arr2[0].answer = 0;
// `0`, because `arr[0]` is a reference to the same object as `arr2[0]`
arr[0].answer;
JavaScript doesn't have a built-in approach for deep cloning an array. You would need to use a library that
has a cloneDeep()
function, like lodash.
const arr = [{ answer: 42 }];
const arr2 = require('lodash').cloneDeep(arr);
arr2[0].answer = 0;
// `42`, because Lodash did a deep clone.
arr[0].answer;