배열은 여러 개의 값을 나열한 자료구조다. 배열이 가지고 있는 값을 요소라고 부른다. 자바스크립트의 모든 값은 배열의 요소가 될 수 있다. 배열의 요소는 0이상의 정수인 인덱스를 갖는다. 인덱스는 배열의 요소에 접근할 때 사용한다.
const arr = ['one', 'two', 'three'];
arr[0] = 'one'
arr[1] = 'two'
arr[2] = 'three'
위 예제의 배열 arr는 요소 'one', 'two', 'three'를 가지고 있다. 첫 번째 요소인 'one'은 인덱스0, 두 번째 요소인 'two'는 인덱스1, 마지막 요소인 'three'는 인덱스2이다.
요소에 접근할 때는 대괄호 표기법을 사용한다.
배열은 길이를 나타내는 length를 프로퍼티로 갖는다. 배열은 인덱스와 길이를 갖기 때문에 for문을 통해 순차적으로 요소에 접근하는 것이 가능하다.
arr.length = 3
for (let i = 0; i < arr.length; i++) {
arr[i] // 'one' 'two' 'three'
}
배열은 객체에 속하지만 일반 객체와는 구별되는 특징이 있다. 가장 명확한 차이는 값의 순서와 길이이다. 인덱스와 길이를 갖는 배열은 반복문을 통해 값에 순차적으로 접근할 수 있다.
구분 | 객체 | 배열 |
---|---|---|
구조 | 프로퍼티 키와 프로퍼티 값 | 인덱스와 요소 |
참조 | 프로퍼티와 키 | 인덱스 |
순서 | 없음 | 있음 |
length | 없음 | 있음 |
이처럼 자바스크립트 배열은 인덱스를 나타내는 문자열을 프로퍼티 키로 가지며 length프로퍼티를 갖는객체이다.
배열의 길이는 배열의 길이를 나타내는 0 이상의 정수를 값으로 갖는다. length 프로퍼티의 값은 빈 배열일 경우 0이며, 빈 배열이 아닐 경우 가장 큰 인덱스값에 1을 더한 것과 같다. length는 배열에 요소를 추가하거나 삭제하면 갱신된다.
const arr ['apple', 'orange', 'grape', 'lemon'];
arr.length = 2;
console.log(arr); // ['apple', 'orange']
현재 length의 값 보다 작은 숫자를 할당하면 배열의 길이가 줄어든다.
const arr ['apple', 'orange', 'grape', 'lemon'];
arr.length = 5;
console.log(arr); // ['apple', 'orange', 'grape', 'lemon', undefined]
이처럼 현재 length의 값 보다 큰 숫자 값을 length에 할당하는 경우 length의 값은 변경되지만 실제 배열에는 아무런 변함이 없다. 배열의 요소 일부가 비어 있는 배열을 희소 배열이라 한다. 일반적인 배열의 length와 언제나 일치하지만 희소 배열은 length와 배열 의 요소의 개수가 일치하지 않는다. 희소 배열의 length는 희소 배열의 실제 요소 개수보다 언제나 크다. 자바스크립트는 문법적으로 희소 배열을 허용하지만 사용하지 않는 것이 좋다. 배열에는 같은 타입의 요소를 연속적으로 위치시키는 것이 최선이다.
참고자료 : 모던 자바스크립트 Deep Dive: 자바스크립트의 기본 개념과 동작 원리