인프런 커뮤니티 질문&답변

김현종님의 프로필 이미지
김현종

작성한 질문수

웹 게임을 만들며 배우는 자바스크립트

안녕하세요 깊은 복사 부분에서 질문 있습니다.

해결된 질문

작성

·

171

0

안녕하세요. 강의 계속 듣다가 질문생겨서 여쭤봅니다.

var arr1 = [1, 2, 3, [1, 2, 3]];
var arr2 = arr1.slice();

// 1번 
arr2[3] = [2, 3, 4];
console.log(arr1);
console.log(arr2); 

// 2번
arr2[3][1] = 6;
console.log(arr1);
console.log(arr2);

2번을 주석처리하고 실행하면

[ 1, 2, 3, [ 1, 2, 3 ] ]
[ 1, 2, 3, [ 2, 3, 4 ] ]

1번을 주석처리하고 실행하면

[ 1, 2, 3, [ 1, 6, 3 ] ]
[ 1, 2, 3, [ 1, 6, 3 ] ]

둘다 주석처리 안하면

[ 1, 2, 3, [ 1, 2, 3 ] ]
[ 1, 2, 3, [ 2, 3, 4 ] ]
[ 1, 2, 3, [ 1, 2, 3 ] ]
[ 1, 2, 3, [ 2, 6, 4 ] ]

이렇게 나옵니다. 강의에서 1단계 값만 복사가 되고 배열 속 배열은 참조만 된다고 말씀하신걸로 알고 있습니다. 그런데 두 경우의 결과가 왜 다르게 나오는지 잘 모르겠습니다.

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

1번의 경우 arr2[3] 자리에 새로운 배열을 넣고 있습니다.

arr2[3] = 새로운값을 하면 arr1[3]에 영향이 없습니다. 첫 depth의 값을 바꾸신 거니까요. 참조 관계가 없습니다.

2번의 경우 arr2[3][1] = 6을 하면 이것은 두 번째 depth의 값을 바꾸신거라서 arr2[3]의 참조 관계가 유지되어 영향이 있습니다.

둘다 주석 처리 안 한 경우는 arr2[3]과 arr1[3]의 참조 관계가 끊겨 있는 상황이므로 arr2[3][1]을 바꿔도 arr1[3][1]은 그대로 유지됩니다.

김현종님의 프로필 이미지
김현종

작성한 질문수

질문하기