forEach
예외를 던지지 않고는
forEach()
를 중간에 멈출 수 없습니다. 중간에 멈춰야 한다면forEach()
가 적절한 방법이 아닐지도 모릅니다. - MDN
forEach
는 적절한 메서드가 아니다.forEach
에 넘겨진 callback 함수에는 break
와 continue
를 사용할 수 없다. (이들은 함수 내에서 사용할 수 없기 때문)// 1️⃣ forEach
const arr = [1, 2, 3, 4];
arr.forEach(element => {
console.log(element); // [result] 1 2 3 4
if (element === 2) {
return;
}
console.log(element) // [result] 1 3 4
})
// return이 break처럼 작동한다.
// 순회가 종료되지는 않는다.
// 2️⃣ for
// 위의 경우를 for문으로 생각하면 이와 같다.
// callback 함수 내부에 존재하는 return이기 때문에 반복문에 영향을 주지 않는다.
const arr = [1, 2, 3, 4];
const callback = (element) => {
console.log(element); // [result] 1 2 3 4
if (element === 2) {
return;
}
console.log(element) // [result] 1 3 4
}
for (let index = 0; index < arr.length; index++) {
callback(arr[index])
}
callback
내부의 return
이기 때문에 반복문에 영향을 주지 않는다고 생각하면 된다.즉, 반복문을 중간에 멈추고 싶다면 다른 방법을 써야한다.
🤔 여기서 잠깐 [ enumerable(열거 가능한) vs iterable(반복 가능한) ]
1️⃣ enumerable : 열거 가능한
- 해당 property의 키를 열거할 수 있다면 열거 가능한 속성이라고 한다.
- 객체에서 문자열로 키가 지정되어 있다. (배열도 객체임)
const obj = { a: 1, b: 2, c: 3, d: 4 }; const arr = [1, 2, 3, 4] Object.keys(obj) // [ 'a', 'b', 'c', 'd' ] Object.keys(arr) // [ '0', '1', '2', '3' ] // 열거 가능한 속성의 키는 Object.keys 메서드를 통해 반환 받을 수 있다. // obj와 arr의 속성은 열거할 수 있으므로 열거 가능한 속성이다.
const obj = { a: 1, b: 2, c: 3 }; Object.defineProperty(obj, 'd', { value: 4, enumerable : false // enumerable 하지 않다. }); console.log(obj.d) // [result] 4 for (const key in obj) { console.log(obj[key]) // [result] 1 2 3 } Object.keys(obj) // [ 'a', 'b', 'c' ]
2️⃣ iterable : 반복 가능한
- 데이터가 주어진 순서대로 표현될 수 있는 iterator 객체를 반환하는 프로토콜을 구현해 둔 상태
- 즉, 순서가 있어야 하므로 문자열, 배열 등의 객체가 iterable하다.
Symbol.iterator
라는 프로퍼티를 가진다.
for..of
for..of
구문을 사용하기 위해서는 collection이 [Symbol.iterator]
속성을 가져야 한다.array
, set
, string
등const arr = [1, 2, 3, 4];
for (const element of arr) {
console.log(element); // [result] 1 2 3 4
}
break
를 통해 순회를 중단 시킬 수 있다.for..in
// 1️⃣ array
const arr = [1, 2, 3, 4]
for (const index in arr) {
console.log(arr[index]) // [result] 1 2 3 4
}
// key 값에만 접근 가능하기 때문에 배열에서는 index에만 접근 가능하다.
// 2️⃣ object
const obj = { a: 1, b: 2, c: 3, d: 4 };
for (const key in obj) {
console.log(obj[key]); // [result] 1 2 3 4
}