for..of
반복문을 사용할 수 있게 됨 배열이 아닌 객체에서 for..of
를 사용해보자
next()
를 호출한다. {done: Boolean, value: any}
즉, 반복이 불가능한 객체더라도
객체[Symbol.iterator]()
를 호출해서 iterator 객체를 만들고
그 메서드인 next()
함수를 정의해서 반복 시 다음 값을 어떻게 만들어낼지 설정하면 된다.
문자열도 배열과 같은 iterable이고, 따라서 for..of도 가능하다.
-> 문자열의 각 글자를 순회한다.
for (let char of "test") {
// 글자 하나당 한 번 실행됩니다(4회 호출).
alert( char ); // t, e, s, t가 차례대로 출력됨
}
for .. of를 쓰지 않고 명시적으로 Symbol.iterator를 호출할 수 있다.
let str = "Hello";
// for..of를 사용한 것과 동일한 작업을 합니다.
// for (let char of str) alert(char);
let iterator = str[Symbol.iterator]();
while (true) {
let result = iterator.next();
if (result.done) break;
alert(result.value); // 글자가 하나씩 출력됩니다.
}
iterable : Symbol.iterator 메서드가 구현된 객체
유사 배열 : 인덱스, length가 있어서 배열같이 동작하는 객체
iterable 객체와 유사 배열은 다른 분류이고, 두 분류 모두에 포함되는 객체가 문자열이다.
iterable과 유사 배열 모두, 실제 배열은 아니기 때문에 배열 메서드인 push, pop 등은 불가능하다.
let arrayLike = {
0: "Hello",
1: "World",
length: 2
};
let arr = Array.from(arrayLike); // (*)
alert(arr.pop()); // World (메서드가 제대로 동작합니다.)