
자바스크립트에서 무심코 사용하지만 실제로는 꽤나 까다로운 Array.length 속성에 대해 알아보자
Array.length는 실무에서 정말 자주 사용되는 속성이다. React 컴포넌트에서 배열을 렌더링 할 때나, 조건문에서 배열의 상태를 체크할 때 등 자주 사용된다. 하지만 이 속성은 우리가 생각했던 것보다 더 복잡한 동작을 한다.
const arr = [1, 2, 3];
console.log(arr.length); // 3
arr.length = 10;
console.log(arr.length); // 10
console.log(arr); // [ 1, 2, 3, , , , , , , ]
배열의 length를 강제로 10으로 설정했더니, 빈 슬롯이 생긴다.
자바스크립트 배열의 가장 큰 특징 중 하나는 바로 이 "구멍"을 가질 수 있다는 점이다.
const arr = [1, 2, 3];
arr[3] = 4; // [1, 2, 3, 4]
arr[9] = 10; // [1, 2, 3, 4, , , , , , 10]
console.log(arr.length); // 10
이처럼 배열은 실제로는 객체처럼 동작하기 때문에, 연속적이지 않은 인덱스에 값을 할당하면 그 사이에 구멍이 생긴다. 이 구멍은
map(), filter() 등의 메서드 실행 시 건너뛰게 된다따라서 Array.length는 "배열의 실제 요소 개수"가 아닌 "마지막 숫자 인덱스 + 1"을 의미한다고 생각한다.
이런 특성을 역이용 하면 배열을 쉽게 조작할 수 도 있다
// 일반적인 배열 비우기 방법들
const arr1 = [1, 2, 3, 4, 5];
arr1 = []; // ❌ const로 선언된 경우 에러 발생
arr1.splice(0); // ⭐️ 동작은 하지만 새로운 배열을 반환
arr1 = new Array(); // ❌ const로 선언된 경우 에러 발생
// length를 활용한 방법
const arr2 = [1, 2, 3, 4, 5];
arr2.length = 0; // ✨ 가장 간단하고 효율적!
console.log(arr2); // []
// 유틸리티 함수로 만들기
function clearArray(array) {
array.length = 0;
return array;
}
// 프로토타입으로 확장하기
Array.prototype.clear = function() {
this.length = 0;
}
// 사용 예시
const arr3 = [1, 2, 3, 4, 5];
arr3.clear();
console.log(arr3); // []
이 방식의 장점
Array.length는 실제 요소의 개수가 아님Array.length의 이상한 동작으로 고민하지 말고, 처음부터 배열을 올바르게 사용하는 것이 해결책이다