배열은 메모리 상에 연속적으로 배치되고 인덱스를 통해 데이터에 접근이 가능하다.
배열의 선언은 두 가지 방식으로 가능하다.
var a = [1, 2, 3, "hello", null, true, []]; // array literal
var a = new Array(1, 2, 3, "hello", null, true, []); // array instantiation
조금 생소하긴 하지만 배열 원소는 여러가지 타입이 가능하다.
배열 크기를 초과한 인덱스에 데이터를 할당하면 해당 인덱스까지 배열의 크기가 증가한다. 자바스크립트의 배열은 "동적 배열" 특징을 가지고 있다.
var a = [1, 2, 3];
a[1000] = 4; // 불안정한 삽입 방법
// [ 4, <999 empty items>, 3 ]
배열 뒤쪽의 원소 삽입/삭제는 push()/pop() 메서드를 이용한다. 앞쪽의 삽입/삭제는 unshift()/shift() 를 이용한다.
var a = [1, 2, 3];
a.push(4); // 삽입
// [ 1, 2, 3, 4 ]
a.pop(); // 삭제
// [ 1, 2, 3 ]
var b = [2, 3];
b.unshift(1); // 삽입
// [1, 2, 3]
b.shift() // 삭제
// [2, 3]
그 밖에도 유용한 메서드를 제공한다.
[111, 222, 333].indexOf(222) // 배열 원소의 인덱스 탐색
// 1
[1,2,3,4].join(); // 배열의 원소를 하나의 문자열로 변환
// "1,2,3,4"
[1,2,3,4].concat(2,3); // 기존 배열에 입력받은 배열을 추가하여 새로운 배열 구성
// 기존 배열은 변경되지 않는다.
// [1,2,3,4,2,3]
var pos = 1, n = 2;
[1,2,3,4].slice(pos, n); // pos 인덱스부터 n개 삭제하여 새로운 배열 재구성
// [1, 4]
[1,2,3,4].slice() // 사본
// [1,2,3,4]
배열은 for 문을 이용할 수 도 있지만, forEach() 메서드를 이용하면 안정성, 가독성을 높일 수 있다. 배열은 iterable 한 Iterator 이므로 foreach, map, filter 를 지원하고 매개변수로 일급 함수를 취급하여 함수형 프로그래밍을 지원한다.
[1, 2, 3].forEach(function(value, index, object) { console.log(value); });
// [1, 2, 3]
var ret = [1, 2, 3].map(function(value, index, object) { return value + 2; });
// [3, 4, 5]
var ret = [1, 2, 3].filter(function(value, index, object) { return value % 2 == 1; });
// [1, 3]
var ret = [1, 2, 3].reduce(function(accumulator, value, index, object) { return accumulator + value; }, 1);
// 7