본문 바로가기
IT/JavaScript

자바스크립트 핵심 가이드 - (배열)

by 최고영회 2013. 12. 23.
728x90
반응형
SMALL

배열은 해당 항목의 오프셋을 계산할 수 있는 정수를 통해 각 항목들을 접근할 수 있는 연속적인 메모리 할당이다. 보통 배열은 매우 빠른 데이터 구조이다.

하지만 불행하게도 자바스크립트에는 이런 류의 배열은 업다.

 

대신 자바스크립트는 배열 같은 특성을 지닌 객체를 제공한다. 

 

01) 배열 리터럴

 var empty = [];

 var numbers = [ 'zero', 'one', 'two', 'three' ];

 

 empty[1]   // undefined

 numbers[1]   // 'one'


 empty.length  // 0

 numbers.length  // 4


 // 다음은 유사한 결과를 보이는 객체 리터럴 이다.

 var number_obj = {

   '0' : 'zero', '1' : 'one', '2' : 'two', '3' : 'three' } ;


numbers와 number_obj 모두 4개의 속성을 가졌고 각 속성은 모두 같은 이름과 같은 값이 있다.

하지만 두 객체의 근본적인 차이점이 있는데 numbers 는 Array.prototype 을 상속했고,

number_obj 는 Object.prototype 을 상속했다는 점이다.

그래서 numbers 만이 많은 수의 유용한 메소드를 상속하게 된다. 

또한 length 라는 신비한 속성을 갖게 된다.

 

대부분의 언어에서 배열의 구성요소들은 모두 같은 데이터 타입이어야 한다.

하지만 자바스크립트에서는 배열 하나에 어떤 데이터 타입의 조합이라도 다 포함될 수 있다.

 var misc = [ 'str', 33.3, true, false, null, undefined, ['n', 'a'], {obj:true}, NaN, Infinity ];

 misc.length  // 10

 

02) length 속성

모든 배열은 length 속성이 있다. 다른 언어들과 달리 자바스크립트에서 배열의 길이는 상계(upper bound) 기반이 아니다. 현재 length 보다 더 큰 첨자로 항목을 추가하면 length 는 새로운 항목을 추가할 수 있게 늘어난다. 아무런 오류도 발생하지 않는다.

 

length 속성은 배열의 가장 큰 정수 속성 이름보다 하나 더 큰 값이다. 

때문에 length 의 값이 배열에 있는 속성의 수와 드시 일치하는 것은 아니다.

 

 var myArr = [];

myArr.length   // 0

 

myArr[100000] = true;

myArr.length    // 100001  

// myArr 은 단지 하나의 속성만 갖는다.

 

length 의 값을 명시적으로 설정할 수 있다. 

length 값을 크게 설정해도 배열을 위해 더 많은 공간이 할당되지는 않는다.

하지만 length 값을 현재 보다 작게 설정하면 설정한 값보다 크거나 같은 첨자에 해당하는 속성은 모두 삭제 된다.

 

 var numbers = ['zero', 'one', 'two', 'three'];

 numbers.length = 2;   // numbers = ['zero', 'one']

 

새로운 항목을 배열의 현재 length 값으로 추가하면 배열의 끝에다 추가할 수 있다.

 

 numbers[numbers.length] =  'shi';

 // numbers is ['zero', 'one', 'shi']

 push 를 이용해서 더욱 편하게 사용할 수 있다.

 numbers.push('go');

 // numbers is ['zero', 'one', 'shi', 'go']

 

03) 삭제

자바스크립트의 배열은 실제 객체이기 때문에 배열의 요소를 삭제하는데 delete 연산자를 사용할 수 있다.

 delete numbers[2];

 // numbers is ['zero', 'one', undefined, 'go'];

 

delete 하면 우리가 원하는 데로 삭제 되는게 아니라 undefined 로 채워진다. 

우리는 splice 라는 메소드를 이용해 배열을 수술할 수 있다.

 numbers.splice(2, 1);

 // numbers is ['zero', 'one', 'go'];

 

splice 는 해당 index 의 내용을 삭제 하고 삭제된 속성 뒤에 있는 모든 속성은 삭제된 후에 새로운 이름으로 다시 삽입 된다. 때문에 배열이 아주 큰 경우에는 빠르게 동작하지 않을 수 있다.

 

04)열거

 

728x90
반응형
LIST