inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

해결된 질문

243

김현종

작성한 질문수 5

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단계 값만 복사가 되고 배열 속 배열은 참조만 된다고 말씀하신걸로 알고 있습니다. 그런데 두 경우의 결과가 왜 다르게 나오는지 잘 모르겠습니다.

javascript 깊은복사

답변 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]은 그대로 유지됩니다.

iput 입력글자 제한에러...

0

225

0

리팩토링 관련 질문입니다. (자스스톤)

0

275

1

카드 짝맞추기 react-native

0

339

0

필터 메소드 관련 질문입니다.

0

336

1

가위바위보 게임 질문드립니다~

0

202

1

자바스크립트 기초에 관해서 질문있습니다.

0

205

1

질문입니다.

1

356

1

이벤트 리스너 안에서 동작 질문드립니다.

0

321

2

질문드립니다.

0

186

0

document.createElement('')함수에서

0

244

2

안녕하세요 클로저 부분에서 질문 있습니다.

0

278

1

안녕하세요 제로초님

0

736

1

끝말잇기 화면에 출력 반복문을 이용해서 횟수 제한

0

243

1

안녕하세요 제로초님 질문있습니다

0

314

1

안녕하세요 강의 정말 잘시청하고있습니다.

0

272

3

?

0

149

1

틱택토 게임에서 게임이 끝나고

0

563

1

9 곱하는게 이해가 안 되요~

0

171

1

지뢰찾기 에러잡아내기에서 질문있습니다!

0

452

4

지뢰찾기 에러 관련 질문!

0

479

3

리팩토링에 관한 질문입니다.

0

237

2

Array/Object spread

0

201

1

지뢰찾기게임에서 Math.random() 질문

0

219

1

질문있습니다!

0

240

1