예전에 사수가 코드리뷰를 하시면서 이런 말씀을 하셨다.
'빈 배열을 만드는 방법 중, 배열의 길이를 0으로 만드는 것과 빈 배열을 할당하는 게 같아 보이지만 차이가 있다.'
처음에는 무슨 말인지 이해를 못해 찾아보았고, 찾아본걸 바탕으로 정리하려고 한다.
배열이 선언 & 할당되어 있을 때,
배열을 초기화(빈 배열로 만들기)하는 방법은 여러가지가 있겠지만 크게 세 가지로 정리해보려고 한다.
우선, 아래와 같은 배열이 있다고 해보자.
let name = ['ria', 'Jun']
방법1. 배열에 새로운 빈 배열을 할당
name = [];
정확하게 말하면 이 방법은 배열을 비우는 것이 아니라, 새로운 빈 배열이 저장된 메모리주소를 참조시키는 것.
1/ let name = ['ria', 'jun']
처음에는 name이라는 변수가 ['ria', 'jun'] 배열의 주소(0x00001332)가 저장된 메모리 주소 0x000000F2를 가리키고 있었다.
2/ name = []
변수 name에 빈배열[]를 재할당한다.
이 때, ['ria', 'jun'] 배열이 []로 변경되는 것이 아니라, 새로운 메모리 주소(0x00001335)에 []를 저장하고, []를 저장한 메모리 주소(참조값. 여기서는 0x00001335)를 저장한 메모리 주소(0x000000F3)를 변수 name이 가리키게 된다.
따라서 정확하게 말하면, '배열을 초기화시킨다'라기 보다는 빈 배열이 저장된 메모리의 주소값을 가리킨다(참조)고 보는게 맞을 것 같다.
## 문제점
빈 배열을 할당하여 배열을 초기화시키면 아래와 같은 문제가 발생할 수 있다.
let name2 = name
name = []
위 코드에서 name2의 값은 어떻게 될까?
name2는 ['ria', 'jun']이 저장된 메모리주소(0x00001332)을 저장하고 있기 때문에 여전히 값은 ['ria', 'jun]이 된다.
방법2. 배열의 길이를 0으로 만들기
name.length = 0
배열의 길이를 0으로 하여 빈 배열로 초기화 할 수 있다.
이 경우, 다른 여러 변수들이 name 배열을 참조하고 있더라도 그 참조 중인 name배열 자체를 초기화하는 것이므로
name배열을 참조 중인 변수에서 같은 결과를 얻을 수 있다.
방법3. for반복문과 pop 메서드 이용하기
for(let i = 0; i < name.length; i++) {
name.pop();
}
pop메서드는 배열의 마지막 요소를 제거한다.
따라서, 위 for문에서는 name배열에서 name배열의 길이만큼 for문을 돌려 pop메서드를 실행해, 마지막 요소를 제거함으로써 최종적으로 모든 요소를 제거해 빈 배열이 되도록 만드는 방법이다.
참조 : https://velog.io/@sukqbe/TILJavaScript-%EB%B0%B0%EC%97%B4
'JavaScript' 카테고리의 다른 글
자바스크립트 동작 원리(Call Stack, Task Queue, Event Loop etc) (0) | 2024.02.04 |
---|---|
비동기 처리 - async/await (2) | 2024.01.03 |
비동기처리 - Promise (1) | 2023.12.29 |
비동기함수의 순서를 제어하는 방법 1. Callback함수 (2) | 2023.12.23 |
callback함수란? (0) | 2023.12.23 |