대괄호 구문이나 속성 접근자를 사용할 경우 배열의 요소가 아니라 Array 객체에 연결된 변수를 참조한다.
const arr = [1, 2, 3, 4];
console.log(arr[1]); // 2
console.log(arr["length"]); // 4
console.log(arr["1"]); // undefined
일반적으로 배열은 동일한 크기의 메모리 공간이 빈틈없이 연속적으로 나열된 자료 구조를 말한다. 배열의 요소는 하나의 타입으로 통일되어 있으며 서로 연속적으로 인접해 있는데, 이러한 배열을 밀집 배열(dense array) 이라 한다.
자바스크립트의 배열은 배열의 요소를 위한 각각의 메모리 공간은 동일한 크기를 갖지 않아도 되며 연속적으로 이어져 있지 않을 수도 있다. 배열의 요소가 연속적으로 이어져 있지 않는 배열을 희소 배열(sparse array) 이라 한다.
배열의 요소 추가, 제거에는 다음과 같은 순서에 따라 동작한다.
1) 추가하려는 index부터 index 뒤의 모든 요소를 1칸씩 뒤로 미룬다.
2) index에 자리가 비어있으므로 해당 자리에 요소를 추가한다.
1) 삭제하려는 index의 요소를 제거한다.
2) index는 비워진다.(Javascript에서는 null 또는 undefined)
3) index부터 뒤의 모든 요소를 1칸씩 앞으로 당긴다.
배열 원소 검색에는 선형 검색(Linear Search)과 이진 검색(Binary Search)로 나뉜다.
1) 새로운 노드의 포인터를 추가하려는 노드가 가리키는 노드를 가리킨다.
2) 추가하려는 노드의 포인터를 새로운 노드를 가리키도록 수정한다.
1) 삭제하려는 노드 이전 노드가 삭제하려는 노드의 포인터를 가리키도록 수정한다.
2) 삭제하려는 노드의 포인터를 제거한다.
지금까지는 자바스크립트의 배열도 일반적인 배열(밀집 배열)의 특징을 갖고 있다고 잘못 생각했다.
결과적으로 자바스크립트의 배열은 일반적인 의미의 배열이 아니라 해시 테이블로 구현된 특수 객체이고, 메모리도 연속적으로 이어져있지 않을 수도 있다는 사실을 알게 되었다.
다음에는 해시 테이블에 대해서도 정리하는 시간을 가져보면 좋을 것 같다는 생각도 들었다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array
https://poiemaweb.com/js-array-is-not-arrray
https://levelup.gitconnected.com/array-vs-linked-list-data-structure-c5c0ff405f16