O(1)
으로 접근・수정할 수 있다.O(1)
으로 원소를 추가할 수 있다.O(1)
으로 삭제할 수 있다.O(N)
이다.ECMAScript에서는 배열을 배열 인덱스 프로퍼티 키를 특별히 처리하는 객체로 정의하고 있습니다. 즉, 배열을 배열 인덱스와 값을 연결하는 맵(딕셔너리)로 정의하고 있습니다.
배열의 고유 프로퍼티는 배열 인덱스와 length
이며, 이 둘은 일반 객체의 프로퍼티와는 다르게 동작합니다. 배열은 객체이므로, 요소와 length
이외의 프로퍼티도 가질 수 있습니다.
따라서 JS의 배열은 아래의 특징을 가집니다.
length
보다 큰 인덱스의 요소) 에도 접근・할당할 수 있습니다.인덱스는 숫자가 아니라 문자열입니다.
0 ≤ i < 2^32 - 1
의 범위에 있는 정수(i) 문자열 키를 의미합니다.
범위를 넘는 인덱스는 일반적인 프로퍼티 키(문자열)로 취급하며, 배열 요소로 표시되지 않고 length 프로퍼티에도 영향이 없습니다.
프로퍼티 이름이 배열 인덱스인 프로퍼티를 요소라고 부릅니다.
configurable: false
인 length
프로퍼티를 가집니다. console.log(Object.getOwnPropertyDescriptors([]));
/*
{
length: {
value: 0,
writable: true,
enumerable: false,
configurable: false
}
}
*/
length
프로퍼티의 값은 모든 배열 인덱스보다 숫자적으로 큽니다. length
프로퍼티는 배열에 포함된 요소의 개수를 나타내지 않습니다. 새 요소를 삽입할 위치를 나타내는 포인터 역할을 합니다. length
가 변경할 경우, length
보다 큰 배열 인덱스를 가지는 요소는 모두 제거됩니다.length
보다 큰 배열 인덱스를 가지는 요소를 추가한 경우, length
는 특성을 지키기 위해 가장 큰 배열 인덱스 + 1 이 됩니다. length
를 0으로 설정하면 빈 배열이 됩니다. 하지만 이 접근법은 각 배열 요소를 명시적으로 삭제하므로 느릴 수 있습니다. 모순처럼 보이지만, 빈 배열을 새로 만드는 편이 더 빠를 때가 많습니다. 배열 리터럴([]
): 배열 요소를 나열합니다. 요소의 위치는 묵시적 인덱스입니다.
Array 생성자: new연산자는 옵션입니다. new없이 일반적인 함수처럼 호출해도 new를 쓴 결과와 같습니다.
※ new 연산자를 이용한 배열 생성은 권장되는 방법이 아닙니다.
Array.of
: Array 생성자의 단점을 보완하기 위해 ES6에 도입되었습니다. 단일 인자로 숫자를 받은 경우에도 해당 인자를 요소로 하는 배열을 생성합니다.
arr instanceof Array
: 배열은 Array
객체의 인스턴스이므로 instanceof
연산자로도 확인을 할 수 있습니다. 다만, 영역(창 또는 프레임)을 넘어온 배열은 프로토타입 객체로 다른 Array를 가르키므로 instanceof
연산자로 확인 할 수 없습니다. Array.isArray(arr)
: instanceof
와 달리 영역(창 또는 프레임)을 넘어온 객체도 정확히 처리한다console.log(window.Array === Array); // true
Array.prototype.values
입니다. Array.prototype.keys
, Array.prototype.values
, Array.prototype.entries
모두 Iterator를 반환합니다.Array.from()
메서드를 사용하면 Iterable과 유사 배열 객체를 배열로 변환할 수 있습니다. Array.from()
은 Iterable의 Iterator를 사용해서 각 요소를 순회하여 배열로 변환합니다. Array.from(iter, callback, thisArg)
: 만들어질 배열의 인덱스에 결과 값을 저장하기 전에 이터러블의 각 값에 특정 연산을 수행하거나 최종 형태로의 변환 작업을 할 수 있습니다. <canvas>
엘리먼트와 사용되도록 설계된 버전을 의미한다. 빠른 산술 비트 연산을 제공하기 위한 포팅 과정의 일부로 타입 배열이 만들어졌다.
배열 공부하자마자 보니까 너무 좋네요. Exotic Object 에 대해서 덕분에 처음 접했어요 👍