IT_Programming/JavaScript

자바스크립트 완벽가이드 - 7.8 배열과 유사한 객체

JJun ™ 2010. 7. 4. 21:56


자바스크립트의 배열이 특별한 이유는 length 프로퍼티가 특별하게 작동하기 때문이다.

  • 이 프로퍼티 값은 배열에 새로운 원소가 추가될 때마다 자동으로 갱신된다.
  • 이 프로퍼티 값을 임의로 설정함으로써 배열의 크기를 확장하거나 촉수할 수 있다.

자바스크립트의 배열은 또한 Array 클래스의 인스턴스(instanceof Array)이며,

따라서 배열을 통해 Array 클래스의 다양한 메서드를 호출할 수 있다.


이러한 점은 자바스크립트 배열의 고유한 특성이다.

그러나 이러한 특성이 배열을 정의하는 본질적인 특성이라고는 볼 수 없다.

때로는 length 프로퍼티와 음이 아닌 정수 이름의 프로퍼티가 있는 임의 객체를 배열로 간주하는 것이

완전히 합리적일 때도 있다.


이렇게 '배열과 유사한' 객체들은 실제로 프로그래밍을 다루는 현장에서도 때때로 마주친다.

비록 이 객체들을 통하여 배열 메서드를 호출한다거나 length 프로퍼티를 사용한 특별한 기능을

기대하는 것은 어렵지만, 실제 배열의 원소들에 대해 반복 작업을 하기 위해 마련한 알고리즘을 그대로

활용할 수 있다.

 

사실상 많은 수의 배열 알고리즘이 실제 배열뿐만 아니라 배열과 유사한 객체들과도 잘 작동한다.

새로운 원소를 배열에 추가하거나 length 프로퍼티를 변경하려 하지 않는한, 배열과 유사한 객체를

실제 배열과 같은 것으로 간주할 수 있다.


다음 코드는 일반적인 객체를 배열과 유사한 객체로 만들기 위해 프로퍼티들을 추가한다.

그렇게 탄생한 유사 배열(pseudo-array)의 '원소'들에 대하여 반복적으로 코드를 수행하는 예를 보여준다.

 

var a = {};  // 일반적인 빈 객체로 시작한다.
이 객체를 '배열과 유사한' 객체로 만들기 위해 프로퍼티들을 추가한다.
var i = 0;
while(i < 10) {
a[i] = i * i;
i++;
}
a.length = i;

// 이제 이 객체가 마치 실제 배열인 것처럼 반복문을 수행한다.
var total = 0;
for(var j = 0; j < a.length; j++)
total += a[j];

 

8.2.2절에서 설명하는 전달인자 객체는 배열과 유사한 객체다.

클라이언트 측 자바스크립트에서는 document.getElementByTagName()과 같은 많은 수의 DOM 메서드가 배열과 유사한 객체들을 결과로 반환한다.