JavaScript 배열과 그 배열의 차이점
먼저 자료구조나 전통적인 정적 배열을 사용하는 언어들(C, C++, Java)의 배열과 Javascript의 배열의 구현과 동작이 다르다.
: 밀집 배열(dense array)
: 배열의 동작을 구현한 객체
: 배열의 일부 요소가 비어있는 배열. [1, empty × 2]
const arr = [1];
arr.length = 3;
console.log(arr); // [1, empty × 2]
console.log(arr.length); // 3
console.log(arr[1]); // undefined
console.log(Object.getOwnPropertyDescriptors(arr));
// {
// 0 : {value: 1, writable: true, enumerable: true, configurable: true}
// length : {value: 3, writable: true, enumerable: false, configurable: false}
// }
배열 길이보다 length에 더 큰값 할당 시 length 프로퍼티 값은 변경됨
하지만 실제 배열엔 empth로 값이 할당되지 않음.
=> 배열의 중간이 비어있는 희소 배열
연속성과 고정된 데이터 타입의 구조를 사용하고 싶다면, ArrayBuffer와 TypedArray 사용하면 된다
ArrayBuffer
: 연속적인 데이터 보관하는 메모리 공간 영역 (바이너리 데이터. 바이트로 구성된 배열)
TypedArray
나 DataView
객체 사용. ArrayBuffer의 할당된 공간은 특정타입의 데이터로 조회, 쓰기 가능. TypedArray
: 타입 지정된 배열
const buffer = new ArrayBuffer(8); // 버퍼의 크기 8 = 8 bytes
const int8arr = new Int8Array(buffer); // 각 요소의 크기는 8bits === 1byte이므로 길이가 8인 Int8Array가 생성
const int16arr = new Int16Array(buffer); // 16비트(2바이트) 정수 타입
console.log(int8arr); // Int8Array [0, 0, 0, 0, 0, 0, 0, 0] : 8개 0으로 초기화된 요소
console.log(int16arr); // Int16Array [0, 0, 0, 0] : 4개의 0으로 초기화된 요소
WebGL 3D를 다루는 Three.js에서는 내부적으로 TypedArray 사용.