holdanddeepdive/javascript-deep-dive

27장 배열 정리

Opened this issue · 0 comments

27.1 배열이란?

  • 자바스크립트에 배열이라는 타입은 존재하지 않는다. 배열은 객체 타입이다.
  • 배열은 객체지만 일반 객체와는 구분되는 독특한 특징이 있다. ▶️ 값의 순서 length
    • 배열이 인덱스를 갖기 때문에 순차적으로 요소에 접근 가능

27.2 자바스크립트 배열은 배열이 아니다

  • 배열의 요소를 위한 각각의 메모리 공간은 동일한 크기를 갖지 않아도 되며, 연속적으로 이어져 있지 않을 수도 있다 → 희소 배열(sparse array) (↔ 밀집 배열)
  • 자바스크립트의 배열은 일반적인 배열의 동작을 흉내 낸 특수한 객체다.
  • 해시테이블로 구현된 객체이므로 인덱스로의 접근이 일반 배열보다 느릴 수 밖에 없는 구조적인 단점이 있으나 특정 요소의 검색, 삽입, 삭제하는 경우 더 빠른 성능을 기대할 수 있다.
  • 대부분 모던 자바스크립트 엔진은 배열을 좀 더 배열처럼 동작하도록 최적화하여 구현

27.3 length 프로퍼티와 희소 배열

  • 배열에 요소를 추가하거나 삭제하면 length 프로퍼티 값은 자동 갱신된다.
  • 현재 값보다 작은 값을 할당하면 배열의 길이가 줄어든다.
  • 큰 값을 할당하면 length는 변경되지만 실제 배열의 길이가 늘어나지는 않는다.
  • 희소 배열은 length와 배열 요소의 개수가 일치하지 않는다. length >= 실제 개수
  • 문법적으로는 희소 배열을 허용하지만 최적화가 된 엔진은 일반적인 배열처럼 연속된 메모리 공간을 확보하는 경우도 있으므로 사용하지 않는 것이 좋다.

27.4 배열 생성

  • 유사 배열 객체(array-like object): 배열처럼 인덱스로 프로퍼티 값에 접근 가능하며 length 프로퍼티를 갖느 객체
  • 이터러블 객체(iterable object): Symbol.iterator 메서드를 구현하여 for...of 문으로 순회할 수 있으며 스프레드 문법과 배열 디스트럭처링 할당의 대상으로 사용할 수 있는 객체
    • Array, String, Map, Set, DOM collection, arguments 등

27.6 배열 요소의 추가와 갱신

  • 정수 이외의 값을 인덱스처럼 사용하면 요소가 생성되는 것이 아니라 프로퍼티가 생성되며 이는 length 프로퍼티 값에 영향을 주지 않는다.

27.7 배열 요소의 삭제

  • delete 연산자를 사용하면 length 프로퍼티 값이 변하지 않는다.
  • Array.prototype.splice 를 사용해야 희소 배열을 만들지 않으면서 삭제가 가능하다.

27.8 배열 메서드

  • 배열에는 원본 배열을 직접 변경하는 mutator method, 원본 배열을 직접 변경하지 않고 새로운 배열을 생성하여 반환하는 accessor method가 있다.