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 문은 프로토타입에서 상속한 프로퍼티도 나열한다는 것입니다.
'JavaScript > Core & 개념ㆍ용어' 카테고리의 다른 글
데이터 타입변환(형 변환) (0) | 2016.09.29 |
---|---|
변수 스코프 알아보기 (1) | 2016.09.29 |
반복문(for문, while문, do-while문) (2) | 2016.09.29 |
JavaScript vs JAVA (0) | 2016.09.29 |
원시값은 기본타입으로 객체가 아니다 (0) | 2016.09.29 |