본문으로 바로가기

javascript for in 문

category JavaScript/Core & 개념ㆍ용어 2016. 9. 29. 09:03

for in 문

for in 문은 객체의 프로퍼티명을 열거하는 반복문입니다.




for in 문은 다음과 같은 구문을 사용합니다.


// for in 문의 문법
for (변수 in 객체식) {
// 문장
}


in 의 왼쪽에는 대입할 곳으로 사용할 수 있는 식을 사용합니다. 

문법상으로는 좌변값을 씁니다. 좌변값이란 대입식의 좌변에 쓸 수 있는 값을 말하는데, 변수명을 쓴다고 생각하면 충분합니다.

for 문과 같이 for in 문 안에서 변수 선언도 할 수 있습니다.(스코프가 for in 문으로 끝나지 않은 점도 같습니다.


다음부터는 이 변수를 루프변수라고 명명하겠습니다.


in의 우측에는 객체 타입인 식을 사용합니다. 이미 아실 수 있겠지만 자바스크립트에는 암묵적 형변환이 있고, 어떤 값이라도 객체 타입으로 형변환을 할 수 있으므로 사실상 어떤 타입의 캆이라도 쓸 수 있습니다.


따라서 불린값이나 숫자값을 써도 에러가 발생하지는 않습니다. 하지만 의미도 없으므로 현실적으로는 객체 타입의 식을 사용한다고 생각하면 됩니다.

객체식에 쓴 객체의 프로퍼티명에 해당하는 문자열이 루프변수에 차례대로 대입되는 방식으로 동작됩니다.


다음은 for in 문을 이용하여 객체의 프로퍼티명과 프로퍼티값을 열거하는 코드입니다.


var obj = {

x : 1,
y : true,
z : 'jaehee'
};

for (var k in obj) {
console.log(k + " : " + obj[k]);
}

/**
* --------------------------------
* 콘솔의 출력값
* --------------------------------
* x : 1
* y : true
* z : jaehee
* --------------------------------
*/


위의 예제의 객체 obj 에는 세 개의 프로퍼티가 있으며 for in 문에서 프로퍼티명인 x, y, z 문자열이 루프변수 k 에 대입됩니다.

루프변수에는 객체를 연관 배열로 하고, 키를 연산하는 k 나 key, 또는 프로퍼티명을 상기시키는 p 나 n(=name) 이란 변수명을 자주 사용하는 것이 관례입니다.

그리고 프로퍼티값을 표시할 때는 obj[k] 와 같이 대괄호 연산을 사용합니다.




배열과 for in 문

배열도 객체로 놓고 보자면 인덱스의 숫자가 프로퍼티명에 해당하기 때문에 다음과 같이 for in 문에 나열할 수 있습니다.

하지만 나중에 설명하겠시지만 배열 요소를 나열할 때는 for in 문의 사용을 권장하지는 않습니다.


var arr = [10, 20, 30];

for (var n in arr) {
console.log(n + " : " + arr[n] );
}

/**
* 0 : 10
* 1 : 20
* 2 : 30
*/




for in 문에서 주의할 사항

for in 문에 관해 주의할 사항을 세 가지를 열거해 보겠습니다.


1. 프로퍼티를 열거하는 순서

2. 열거할 수 없는 프로퍼티의 존재

3. 프로토타입 상속한 프로퍼티


프로퍼티를 열거하는 순서

위의 예제 코드 중 객체 리터럴 식에 쓴 것에 대한 결과값이 순서대로 나오기는 하였지만 객체 리터럴에 쓴 순서대로 열거되지 않습니다.

다시말해서 순서가 보장되는 것이 아닙니다. 원래 프로퍼티 간에는 순서가 없는 것으로 순서를 의식하는 것 자체가 잘못된 것입니다.

한편, 배열의 경우는 순서를 의식하는 데이터타입입니다. 

위의 배열 코드에서도 마찬가지로 기대한 순서를 보이고는 있지만 for in 문은 순서를 보장하지 않기 때문에 이 같은 동작 방식에 지나치게 의존해서는 안됩니다.



열거할 수 없는 프로퍼티의 존재

두번째로 주의할 점은 for in 문에 나열할 수 없는 프로퍼티의 경우입니다.

예를 들어, 배열 객체에는 length 프로퍼티가 존재하지만 위의 코드에서와 같이 for in 문에서는 열거할 수 없습니다.

length 프로퍼티는 열거할 수 없는 속성의 프로퍼티이기 때문입니다.



프로토타입 상속한 프로퍼티

세번째로 주의할 점은 for in 문은 프로토타입에서 상속한 프로퍼티도 나열한다는 것입니다.



Jaehee's WebClub