[JavaScript] Array.prototype.fill() 은 객체를 참조복사한다

sujpark·2022년 4월 20일
1

코테 실수 시리즈

목록 보기
2/2

예전에 C++로 풀었던 BFS 문제를 JavaScript 로 풀었는데, 같은 로직임에도 불구하고 풀리지 않았다.

코드를 한줄씩 테스트 해보고서야 배열을 생성하는 코드에 문제가 있었다는 것을 알아냈다.
평소에 선언과 동시에 초기화 하기 위해 new Array(5).fill(0) 같은 코드를 작성하곤 했는데, 다차원 배열에 그대로 적용한 것이 문제였다.
5x5 배열을 생성하면서 -1로 초기화를 하기위해 다음과 같은 코드를 사용했었다.

const distance = new Array(5).fill(new Array(5).fill(-1));

Array.prototype.fill() 에 객체를 넣으면 객체를 참조복사한다.

따라서 위 코드는 하나의 1x5 배열을 생성하여 5번 push 하는 코드이다.
한 배열의 참조가 5번 들어간 것이기 때문에 하나의 배열을 고치면 다른 배열도 똑같이 바뀌게 된다.

const distance = new Array(5).fill(new Array(5).fill(-1));
distance[0][0] = 1;
console.log(distance) 
// [[1,0,0,0,0], [1,0,0,0,0], [1,0,0,0,0], [1,0,0,0,0], [1,0,0,0,0]]

다차원 배열을 선언하면서 초기화하기 위해서는 아래와 같은 코드를 작성해야한다.

const distance = Array.from(new Array(5), () => new Array(5).fill(-1));
profile
JavaScript TypeScript React Next.js

0개의 댓글