결론부터 말하자면 자바스크립트 배열은 일반적으로 말하는 배열이 아니다. 그 이유는 연속적인 메모리를 사용하지 않기 때문이다. 일반적인 배열은 연속적인 메모리를 사용한다. 예로 메모리 주소가 1000이고, 각 요소가 8바이트를 사용한다면 인덱스를 이용하여 아래와 같이 접근한다.
0: 1000 + 8 * 0 = 1000
1: 1000 + 8 * 1 = 1008
2: 1000 + 8 * 2 = 1016
3: 1000 + 8 * 3 = 1024
이처럼 배열은 인덱스를 통해 효율적으로 요소에 접근할 수 있다. 하지만 특정한 값을 찾는 경우, 모든 배열 요소를 처음부터 값을 발견할 때까지 차례대로 찾아야 한다(시간 복잡도 O(n)). 또 특정 위치에 값을 끼워넣거나 삭제하는 경우에도, 그 이후의 요소들을 미루고 당겨야한다는 단점도 있다.
사실 자바스크립트 배열은 객체이다. (해시 테이블로 구현되어 있음)
위 처럼 value에 값을 저장하는 객체일 뿐이다. 그리고 배열의 요소는 단순히 객체의 키로 사용한다.
그렇다면 자바스크립트를 만든 개발자는 왜 배열을 객체로 만들었을까?
즉, 자바스크립트 배열은 인덱스를 사용해서 빠르게 접근할 수 있는 장점을 버리고, 값을 삭제하거나 삽입할 때 효율을 택한 것이다.
자바스크립트에는 ES2017부터 일반적인 배열을 지원한다. Int8Array, Int32Array와 같은 생성자를 사용하면 일반적인 배열으로 사용할 수 있다.
위와 같이 인덱스 접근 성능 테스트를 해보면 일반적인 배열인 Int32Array가 훨씬 빠르다는 것을 알 수 있다.