해결된 질문
작성
·
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]은 그대로 유지됩니다.