728x90
반응형
[JS] JavaScript ES6 Symbol 완벽 가이드 | 고유한 키 생성하기
[JS] JavaScript ES6 Symbol 완벽 가이드 | 고유한 키 생성하기
[JS] JavaScript ES6 화살표 함수(Arrow Function) 완벽 가이드 [JS] JavaScript ES6 화살표 함수(Arrow Function) 완벽 가이드[JS] JavaScript ES6 클래스 정적 메서드와 프로퍼티 완벽 정리 [JS] JavaScript ES6 클래스 정적
crushed-taro.tistory.com
1. iterable(이터러블)
- ES6 이전의 순회 가능한 데이터 컬렉션, 배열, 문자열, 유사 배열 객체, DOM 컬렉션 등은 통일 된 규약 없이 for문, for…in문, forEach 메서드 등 다양한 방법으로 순회 할 수 있었다.
- ES6에서는 순회 가능한 데이터 컬렉션을 이터레이션 프로토콜을 준수하는 이터러블로 통일하여 for…of문, 스프레드 문법, 배열 디스트럭처링 할당의 대상으로 사용할 수 있도록 일원화했다.
1. iterable(이터러블)
1. iterable(이터러블)
- 이터러블(iterable) 은 메서드 Symbol.iterator가 구현된 객체이다.
let range = {
from: 1,
to: 5
};
// Symbol.iterator를 추가한다.
// for..of 최초 호출 시, Symbol.iterator가 호출된다.
range[Symbol.iterator] = function () {
// Symbol.iterator는 이터레이터 객체를 반환한다.
return {
current: this.from,
last: this.to,
// for..of 반복문에 의해 반복마다 next()가 호출된다.
next() {
// next()는 값을 객체 {done:.., value :...} 형태로 반환한다.
// done은 반복이 끝났음을 의미하며, 끝나지 않았을 경우 value가 다음 값이 된다.
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
};
// 객체 선언 후 for..of 반복문을 호출하면 range is not iterable 이라는 오류가 발생한다.
// Symbol.iterator를 추가한 뒤 1~5까지의 숫자가 출력된다.
for (let num of range) {
console.log(num);
}
2. array and string(배열과 문자열)
1. array and string(배열과 문자열)
- 배열, 문자열 등은 대표적인 이터러블이다.
- 문자열이나 배열 같은 내장 이터러블에도 Symbol.iterator가 구현되어 있어 명시적으로 호출 할 수도 있다.
- 자주 사용하지는 않지만 필요 시 for…of 사용보다 반복 과정을 더 잘 통제할 수 있다.
for (let char of "JavaScript") {
// 문자열을 for...of 반복문으로 호출한다.
console.log(char);
}
let str = "iterable";
let iterator = str[Symbol.iterator]();
while (true) {
let result = iterator.next();
if (result.done) break;
console.log(result.value);
}
3. iterable and array like(이터러블과 유사 배열)
1. iterable and array like(이터러블과 유사 배열)
- 이터러블(iterable) : 메서드 Symbol.iterator가 구현된 객체
- 유사 배열(array-like) : 인덱스와 length 프로퍼티가 있어서 배열처럼 보이는 객체
- 이터러블이면서 유사 배열일 수 있고 이터러블 객체라고 해서 유사 배열 객체는 아니며 유사 배열 객체라고 해서 이터러블 객체인 것도 아니다. (별도의 개념)
- 이터러블과 유사 배열은 배열 메서드를 사용할 수 없어 불편할 때가 있는데 Array.from을 이용해서 배열로 변경할 수 있다.
- 유사 배열 테스트
let arrayLike = {
0: "배열인듯",
1: "배열아닌",
2: "배열같은너",
length: 3
};
// console.log(arrayLike.pop()); // 배열 메서드 사용 불가 - arrayLike.pop is not a function
// Array.from()은 넘겨 받은 인수가 이터러블이나 유사 배열인 경우,
// 새로운 배열을 만들고 객체의 모든 요소를 새롭게 만든 배열로 복사한다.
let arr = Array.from(arrayLike);
console.log(arr.pop()); // 배열 메서드 사용 가능
- 이터러블 테스트
/* Note. 앞의 01_iterable 코드에서 복붙 가능 */
// 이터러블(iterable) 은 메서드 Symbol.iterator가 구현된 객체이다.
let myRange = {
from: 1,
to: 5
};
// Symbol.iterator를 추가한다.
// for..of 최초 호출 시, Symbol.iterator가 호출된다.
myRange[Symbol.iterator] = function () {
// Symbol.iterator는 이터레이터 객체를 반환한다.
return {
current: this.from,
last: this.to,
// for..of 반복문에 의해 반복마다 next()가 호출된다.
next() {
// next()는 값을 객체 {done:.., value :...} 형태로 반환한다.
// done은 반복이 끝났음을 의미하며 끝나지 않았을 경우 value가 다음 값이 된다.
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
};
let arr2 = Array.from(myRange);
console.log(arr2);
console.log(arr2.pop()); // 배열 메서드 사용 가능
// Array.from()에는 매핑(mapping) 함수를 선택적으로 넘겨줄 수 있다. 요소 추가 전 각 요소를 대상으로 매핑 함수를 적용해 반환된 값이 추가 된다.
let arr3 = Array.from(myRange, num => num * num);
console.log(arr3);
- 이터러블은 데이터의 소비자(for…of, 스프레드 문법, 배열 디스트럭처링 할당 등)와 공급자(Array, String, DOM 컬렉션)를 연결하는 인터페이스의 역할을 한다.
728x90
반응형
'이것 저것 개발 공부 > JavaScript' 카테고리의 다른 글
[JS] JavaScript ES6 Destructuring 완벽 가이드 – 배열과 객체 해체 문법 (0) | 2025.04.03 |
---|---|
[JS] JavaScript ES6 Spread 연산자 사용법 & 실전 예제 모음 (0) | 2025.04.03 |
[JS] JavaScript ES6 Symbol 완벽 가이드 | 고유한 키 생성하기 (0) | 2025.04.02 |
[JS] JavaScript ES6 화살표 함수(Arrow Function) 완벽 가이드 (0) | 2025.04.01 |
[JS] JavaScript ES6 클래스 정적 메서드와 프로퍼티 완벽 정리 (0) | 2025.04.01 |