[javascript] JavaScript에서 배열을 복제하는 가장 빠른 방법-슬라이스 대 ‘for’루프

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 loop2.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));