2012-11-21 5 views
1

JavaScript가 어떻게 작동하는지 이해하지 못한다고 생각합니다. 배열이 있다고 가정 해 봅시다. 배열은 arr1이고, 그 안에 6 개의 int 인 [1,2,3,4,5,6]이 있습니다. I는 새로운 배열 할 경우 자바 스크립트 배열 이상한가?

var arr2 = arr1 

I가 변경 arr2에 반영 arr1을 변경하면 ( arr1 불변의 복사본을 유지하기위한 목적으로).

기본적으로 arr1을 조작하고 있습니다. 테스트 목적으로 나는 arr1의 변경되지 않은 복사본을 갖고 싶었 기 때문에 완료되면 console.log를 웹 페이지에 출력하고 차이점을 확인할 수 있습니다. 그러나 다시 arr1을 변경하면 해당 변경 사항이 arr2에 반영됩니다.

아무도 왜이 일이 일어나는 이유는 무엇인지 설명 할 수 있습니까? 이 문제가 발생하는 이유를 수정하는 것보다 더 관심이 있습니다.

한 가지 방법은 arr2 별도의 배열을하고, arr1의 데이터

for(int i = 0; i < arr1.length; i++) arr2[i] = arr1[i] 

하지만 배열이 거대한 있다면, 그 비싼 수 있습니다 그것을 채우기 위해 루프를 사용하는 것입니다. 어떤 도움을 주셔서 감사합니다.

+0

로 할 수있는 배열을 복제합니다. –

+0

관련 질문 : http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language – WildCrustacean

답변

8

(예 : 배열과 같은) 비 프리미티브를 할당 . 동일한 배열에 다른 참조를 만들고 있습니다.

당신이 원하는 경우 사본 배열 :

var arr2 = arr1.slice(); 
// or 
var arr2 = arr1.concat(); 

더 읽기 : https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array

+0

1 초에 나를 이길 ... –

+0

@ Kolink도 잠깐. 우리의 대답은'2012-11-21 18 : 44 : 50Z'입니다. ':)' –

+0

두 분 모두 빠른 답변을 보내 주셔서 감사합니다. – user1759942

3

개체는 값이 아닌 참조로 전달됩니다.

배열의 복사본을 만들려면 시도 : 당신은 복사를하지 않는

var arr2 = arr1.slice(0); 
1

자바 스크립트가 있으므로 arr1arr2 실제로 같은 배열을 가리키는되는, 참조에 의해 배열에 대해 다루고 있습니다.

은 당신이 아마하고 싶은이 동작은 복제라고, 당신은 보조 노트로 slice

var arr2 = arr1.slice(0);