typeof [] === "object"; // true
자료구조에서의 배열은 같은 크기의 메모리 공간이 연속적으로 이어져 있습니다. 아래와 같이 배열의 요소는 같은 데이터 타입이 서로 연속적으로 연결되어 있습니다. 이러한 배열을 밀집배열(dense array) 이라고 합니다.
// 인덱스 1인 요소(8바이트)의 메모리 주소
배열의 시작 메모리 주소(1000) + 탐색 인덱스(1) * 요소의 바이트 수(8) = 1008
이와 같은 배열은 인덱스를 통해 임의의 요소에 O(1)
의 시간 복잡도로 빠르게 접근할 수 있습니다. 만약 배열의 요소를 추가 또는 삭제하는 경우에는 배열의 연속성을 위해 요소를 이동해야 하기 때문에 O(n)
의 시간복잡도를 가집니다.
자바스크립트의 배열은 일반적인 배열과 달리 배열의 요소가 연속적으로 연결되어 있지 않습니다. 이러한 배열을 희소 배열(sparse array) 이라고 합니다. 희소 배열의 경우 요소 개수보다 길이가 더 큰 값입니다.
let array = [];
arr[100] = "array element";
arr.length; // 101
arr; // (101) [empty × 100, "array element"]
자바스크립트의 배열은 해시 테이블로 만들어져 객체의 key
를 인덱스로 value
를 요소로 가지는 객체입니다. 따라서 일반적인 배열보다 요소의 탐색, 추가, 삭제가 빠릅니다.
let array = ["a", "b", "c"];
console.log(Object.getOwnPropertyDescriptors(array))
{
0: {value: "a", writable: true, enumerable: true, configurable: true}
1: {value: "b", writable: true, enumerable: true, configurable: true}
2: {value: "c", writable: true, enumerable: true, configurable: true}
length: {value: 3, writable: true, enumerable: false, configurable: false}
}
typeof
연산자를 통해서 원시 타입(Number, String, Booleam 등) 체크는 가능하지만 일반 객체를 제외한 Date, 정규표현식 등 대부분의 객체는 다른 방법으로 구분해야 합니다.Array.isArray()
메서드 또는 Function.prototype.call
메서드를 사용합니다.Array.isArray([]); // true
Object.prototype.toString.call([]); // "[object Array]"
Sparse Arrays vs Dense Arrays in JavaScript - Explained with Examples
Data Structures: Objects and Arrays :: Eloquent JavaScript