IT_Programming/JavaScript

자바스크립트 완벽가이드 - 6.9 for/in

JJun ™ 2010. 7. 4. 20:33


자바스크립트에서 for 키워드는 두 가지 방법으로 쓰인다.

그 중 하나인 for 루프의 사용법은 이미 앞에서 접했다.

 

두 번째 방법은 for/in 문인데, 이 문장은 조금 다른 종류의 루프이다.

 

문법은 다음과 같다.

for (변수 in 객체)
문장


'변수'는 변수 이름, 또는 변수/배열 객체/객체 프로퍼티를 선언하는 var문이어야 한다. (즉, 할당 표현식의 좌변에 적합한 표현식이어야 한다.) '객체'는 객체 이름 또는 객체로 평가될 수 있는 표현식이어야 한다. 앞에서와 마찬가지로 '문장'은 루프의 몸체를 구성하는 문장 또는 문장 블록이어야 한다.


배열의 모든 원소에 대하여 루프를 돌리려면 간단히 인덱스 변수를 증가시키면서 while이나 for 루프를 돌리면 된다. for/in 문은 객체의 모든 프로퍼티에 대해 루프를 돌리는 방법을 제공한다. for/in 루프의 몸체는

'객체'의 각 프로퍼티마다 한번씩 실행되는데, 루프 몸체가 실행되기에 앞서 객체에 속한 프로퍼티들 중

하나의 이름이 '변수'에 문자열의 형태로 할당된다. 루프 몸체 속에서는 이 이름을 [] 연산자 속에 사용하여 해당되는 객체 프로퍼티의 값을 찾을 수 있다. 예를 들어 다음 for/in 루프는 주어진 객체의 모든 프로퍼티에 대해 이름과 값을 출력한다.

for (var prop in my_object) {
document.write("name:" + prop +"; value: " + my_object[prop], "<br>");
}


for/in 루프의 '변수에는 임의의 표현식을 사용할 수 있다. (최소한 할당 표현식의 좌변에 적합한 무언가로 평가되기만 한다면) 이 표현식은 루프가 매회 돌 때마다 평가된다. 즉 매회 다르게 평가될 수 있다는 것을 의미한다. 예를 들어 다음과 같은 코드를 사용하면 주어진 객체의 모든 프로퍼티 이름을 배열에 복사할 수 있다.

var o = {x:1, y:2, z:3};
var a = new Array();
var i = 0;
for(a[i++] in o) /* 루프 몸체는 비어있다. */;


자바스크립트에서 배열은 그저 특별한 종류의 객체에 지나지 않는다. 따라서 for/in 루프는 객체 프로퍼티와 마찬가지로 배열 인덱스 역시 하나씩 열거할 수 있다. 예를 들어 이전의 예제 코드에 아래의 한 줄을 추가하면 배열 '프로퍼티' 0, 1, 2를 열거할 수 있다.

for(i in a) alert(i);


for/in 루프에서 객체 프로퍼티들이 변수에 할당되는 순서는 정해지지 않았다. 이 순서를 미리 사전에 알 수 있는 방법은 없으며 자바스크립트 구현이나 버전에 따라 순서가 달라질 수 있다. 만일 for/in 루프 몸체에서 아직 열거되지 않은 프로퍼티를 삭제하면 해당 프로퍼티는 열거되지 않을 것이다. 만일 for/in 루프 몸체에서 새로운 프로퍼티를 정의한다면, 해당 프로퍼티가 루프에서 열거될지 여부는 자바스크립트 구현에 달려있다.


for/in 루프가 모든 객체에서 가능한 모든 프로퍼티에 대해 전부 루프를 돌리지는 않는다.

몇몇 객체 프로퍼티가 읽기 전용이나 영구적(삭제 불가)인 것으로 지정되어 있는 것과 마찬가지로,

몇몇 프로퍼티들은 열거 불가로 지정되어 있다. 이들 프로퍼티는 for/in 루프에 의해 열거되지 않는다.

사용자 정의 프로퍼티들은 모두 열거되지만 많은 수의 내장 프로퍼티(모든 내장 메서드도 포함하여)는

열거되지 않는다. 7장에서는 다른 객체의 프로퍼티를 상속하는 방법을 배운다.

상속된 사용자 정의 프로퍼티는 for/in 루프에 의해 열거된다.