var dup_array = original_array.slice();
for(var i = 0, len = original_array.length; i < len; ++i) dup_array[i] = original_array[i]; I know both ways do only a shallow copy: if original_array contains references to objects, objects won't be cloned, but only the references will be copied, and therefore both arrays will have references to the same objects. But this is not the point of this question. I'm asking only about speed.
There are at least 5 (!) ways to clone an array:
- spread operator (FASTEST)
There has been a huuuge BENCHMARKS thread, providing following information:
for blink browsers
slice()is the fastest method,
concat()is a bit slower, and
while loopis 2.4x slower.
for other browsers
while loopis the fastest method, since those browsers don’t have internal optimizations for
This remains true in Jul 2016.
Below are simple scripts that you can copy-paste into your browser’s console and run several times to see the picture. They output milliseconds, lower is better.
n = 1000*1000; start = + new Date(); a = Array(n); b = Array(n); i = a.length; while(i--) b[i] = a[i]; console.log(new Date() - start);
n = 1000*1000; start = + new Date(); a = Array(n); b = a.slice(); console.log(new Date() - start);
Please note that these methods will clone the Array object itself, array contents however are copied by reference and are not deep cloned.
origAr == clonedArr //returns false origAr == clonedArr //returns true
slice is the fastest way. However, it is even faster if you add the
0 begin index.
is faster than
what about es6 way?
arr2 = [...arr1];
Easiest way to deep clone Array or Object:
var dup_array = JSON.parse(JSON.stringify(original_array))
var cloned_array = .concat(target_array);
I put together a quick demo: http://jsbin.com/agugo3/edit
My results on Internet Explorer 8 are 156, 782, and 750, which would indicate
slice is much faster in this case.