JavaScript에서 배열을 복제하려면 다음 중 사용하는 것이 더 빠릅니까?
슬라이스 방법
var dup_array = original_array.slice();
For
고리
for(var i = 0, len = original_array.length; i < len; ++i)
dup_array[i] = original_array[i];
나는 두 가지 방법으로 만 할 알고 얕은 복사 : original_array 개체에 대한 참조를 포함하는 경우, 객체는 복제되지 않지만 참조 만이 복사됩니다, 따라서 두 배열은 같은 객체에 대한 참조를해야합니다. 그러나 이것은이 질문의 요점이 아닙니다.
나는 단지 속도에 대해서만 묻고있다.
답변
배열을 복제하는 방법 은 적어도 5 가지 (!) 있습니다.
- 고리
- 일부분
- Array.from ()
- 연결하다
- 스프레드 연산자 (FASTEST)
huuuge BENCHMARKS 스레드 가 있으며 다음 정보를 제공합니다.
-
대한 깜박임 브라우저
slice()
, 가장 빠른 방법입니다concat()
조금 느린이며,while loop
2.4 배는 느립니다. -
다른 브라우저의
while loop
경우 가장 빠른 방법입니다. 해당 브라우저에는slice
및에 대한 내부 최적화가 없기 때문concat
입니다.
2016 년 7 월에도 마찬가지입니다.
다음은 브라우저의 콘솔에 복사하여 붙여넣고 여러 번 실행하여 그림을 볼 수있는 간단한 스크립트입니다. 그들은 밀리 초를 출력하며 낮을수록 좋습니다.
while 루프
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);
이러한 메소드는 Array 객체 자체를 복제하지만 배열 내용은 참조로 복사되며 딥 복제되지는 않습니다.
origAr == clonedArr //returns false
origAr[0] == clonedArr[0] //returns true
답변
기술적 slice
으로 가장 빠른 방법입니다. 그러나0
시작 색인 을 추가하면 더 빠릅니다 .
myArray.slice(0);
보다 빠르다
myArray.slice();
http://jsperf.com/cloning-arrays/3
답변
es6 방법은 어떻습니까?
arr2 = [...arr1];
답변
배열 또는 객체를 딥 복제하는 가장 쉬운 방법 :
var dup_array = JSON.parse(JSON.stringify(original_array))
답변
var cloned_array = [].concat(target_array);
답변
빠른 데모를 만들었습니다 : http://jsbin.com/agugo3/edit
Internet Explorer 8의 결과는 156, 782 및 750이며이 slice
경우 훨씬 빠릅니다.
답변
a.map(e => e)
이 작업의 또 다른 대안입니다. 현재로서는 Firefox에서는 .map()
매우 빠르지 만 (거의 .slice(0)
) Chrome에서는 그렇지 않습니다.
반면에 배열이 다차원 인 경우 배열은 객체이고 객체는 참조 유형이므로 슬라이스 또는 연결 방법 중 어느 것도 치료법이 될 수 없습니다. 따라서 배열을 복제하는 적절한 방법 중 하나 Array.prototype.clone()
는 다음과 같습니다.
Array.prototype.clone = function(){
return this.map(e => Array.isArray(e) ? e.clone() : e);
};
var arr = [ 1, 2, 3, 4, [ 1, 2, [ 1, 2, 3 ], 4 , 5], 6 ],
brr = arr.clone();
brr[4][2][1] = "two";
console.log(JSON.stringify(arr));
console.log(JSON.stringify(brr));