반응형
![[JAY⌨️JS] 자바스크립트 for in, for of 루프의 차이점](http://t1.daumcdn.net/tistory_admin/static/images/xBoxReplace_250.png)
1️⃣ 비슷한 기능을 하는 for..in, for ...of 무슨 차이가 있을까?
- JavaScript는 Object, Array, Map 및 String과 같은 Collection을 반복하는 여러 메서드를 제공한다.
- for in과 for of는 ES6에서 요소를 순회하기 위한 목적으로 새롭게 추가 되었다.
- 두 메서드의 구현 방식은 동일하다. 그렇다면 차이점은 뭘까? 아래 예제를 통해 살펴보자.
1️⃣ for...in loop
✅ Object와 함께 for...in 사용
- for...in은 Object의 key를 순회.
- 아래 예시와 같이 사용하면 key를 순회하면서 value값도 함께 표시할 수 있다.
// for..in Input
const car = {
make: "🚘Tesla",
model: "Model 3",
year: 2020
};
for (const i in car) {
console.log(`${i}: ${car[i]}`);
// key값에 접근, value는 직접 접근 불가
}
// for..in Output
make: 🚘Tesla
model: Model 3
year: 2020
✅ Array와 함께 for…in 사용
- for...in 은 Object를 순회할 때 key를 가져오는데 Array는 key가 없으므로 index를 가져온다.
- array에서 반환되는 index 값은 number가 아닌 string이라는 점 주의.
// for..in Input
const fruits = ["🍎apple", "🍌banana", "🍊orange"];
for (const i in fruits) {
console.log(`${i}: ${fruits[i]}`);
}
// for..in Output
0: 🍎apple
1: 🍌banana
2: 🍊orange
⚠️ for...in loop 사용 시 주의사항.
😰 성능 문제
- JavaScript 반복문 중 명확한 속도 차이가 있는 것은 for-in문뿐이다.
- for in loop 를 반복할 때마다 인스턴스 또는 프로토타입 체인을 검색하게 되므로
결과적으로 for...of를 비롯해 배열 메소드 forEach map filter 등과 같은 반복문보다 느린 속도를 가진다.
// for...in Input
// 1-1. Array.prototype에 customProperty를 추가.
Array.prototype.customProperty = 'This is a custom property on the Array prototype';
// 1-2. for..in loop를 사용할 배열을 생성.
const myArray1 = [1, 2, 3, 4, 5];
// 1-3. for in loop를 사용하면 customProperty도 출력됨.
for (const i in myArray1) {
console.log(myArray1[i]);
}
// for..in Output
1,
2,
3,
4,
5,
This is a custom property on the Array prototype
상속과 프로토타입 - JavaScript | MDN
Java 나 C++ 같이 클래스 기반의 언어를 사용하던 프로그래머는 자바스크립트가 동적인 언어라는 점과 클래스가 없다는 것에서 혼란스러워 한다. (ES2015부터 class 키워드를 지원하기 시작했으나,
developer.mozilla.org
🥵 반환 문제
- Array에 for..in loop를 활용하면 index에 할당되는 값들은 "0", "1", "2"과 같이 Number가 아닌 String으로 반환하기 때문에
숫자연산을 해야 할 경우 parseInt() 등의 메소드로 일일이 정수로 변환해 주는 작업을 해야 한다.
//for..in Input
const myArray2 = [10, 20, 30];
for (const i in myArray2) {
console.log(parseInt(i) + 100);
}
// for..in Output
110, 120, 130
// key + 100 연산을 그대로 진행한다면 결과가 아래와 같다.
// = 0100, 1100, 2100
2️⃣ for...of loop
- Object를 제외한 반복 가능한 iterable Object Array Map Set String 등을 순회.
- for...in 처럼 Object의 key 또는 index를 반복하는 게 아니라 요소를 직접 반복.
- 반환되는 index나 value의 number는 그대로 number로 반환되기 때문에 숫자 연산도 문제없이 가능하다.
✅ Array와 함께 for…of 사용
// for..of Input
const fruits = ["🍎apple", "🍌banana", "🍊orange"];
for (const i of fruits) {
console.log(i);
}
// for..of Output
🍎apple
🍌banana
🍊orange
✅ Map과 함께 for…of 사용
// for..of Input
const map = new Map([
["one", 1],
["two", 2],
["three", 3]
]);
for (const [key, value] of map) {
console.log(`${key}: ${value + 100}`);
}
// for..of Output
one: 101
two: 102
three: 103
✅ Map과 함께 for…of 사용
// for..of Input
const greeting = "Hello, World!";
for (const i of greeting) {
console.log(i);
}
// for..of Output
H
e
l
l
o
,
W
o
r
l
d
!
🙋🏻♀️ 결론!
- for...inloop는 Object의 열거 가능한 속성(iterable)의 (key)를 임의의 순서로 순회.
- for...ofloop는 순회할 수 있는 객체의 값(values)을 순회.
- 크게 고민할 것 없이 Object가 아니면 그냥 for...of 루프를 사용하면 된다.
반응형
'javascript' 카테고리의 다른 글
[JAY⌨️JS] 자바스크립트 객체지향의 핵심인 Class에 대해 알아보자 (0) | 2023.05.08 |
---|---|
[JAY⌨️JS] 자바스크립트 객체 지향 프로그래밍 예제를 통해 살펴보기 (0) | 2023.04.23 |
[JAY⌨️JS] 자바스크립트 조건문 if, switch, Ternary Operator(삼항 연산자) (2) | 2023.03.07 |
[JAY⌨️JS] 자바스크립트 반복문 for, while (부록: 별찍기 과제..) (0) | 2023.03.02 |
[JAY⌨️JS] 자바스크립트 함수 function 이해하기 (0) | 2023.02.27 |