ES5의 순회보다 선언적으로 바뀌었다.
const arr = [1, 2, 3];
//es5 - Array객체의 length 프로퍼티를 활용한다.
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
//es6
for (const el of arr) {
console.log(el);
}
es5에서는 때문에 Set, Map 객체의 순회가 이뤄지지 않았다. 하지만 es6에서는 for of 문을 통해서 순회를 할 수 있다.
[Symbol.iterator]!
객체에 [Symbol.iterator]
프로퍼티에 iterator 메서드가 있다면 for of가 동작하게 된다.
반례로 Array객체의 [Symbol.iterator]
에 null을 할당하면 for of는 동작하지 않는다.
JS의 Set, Map, Array는 iterable / iterator 프로토콜을 따른다.
iterable / iterator 프로토콜: iterable이 동작하도록 정한 규약
iterable: iterator를 리턴하는 [Symbol.iterator]
메서드를 가진 값.
ex) Array객체는 iterable이다.
iterator: { value, done }
객체를 리턴하는 next메서드를 가진 값.
const arr = [1, 2, 3];
const iterator = arr.[Symbol.iterator]();
// iterator.next()가 리턴한 객체를 done프로퍼티가 true가 될 때까지 순차적으로 value프로퍼티 값을 반환한다.
이 메서드들은 iterator를 반환한다. 그런데 [Symbol.iterator]를 갖고 있어 for of문 등 iterable 프로토콜 코드에서 사용할 수 있다. ([Symbol.iterator]가 자기 자신을 참조하기 때문)
// 이런 형태를 띄우고 있다.
cosnt iterable = {
[Symbol.iterator]() {
return {
next() {
return { value, done }
},
[Symbol.iterator]() {
return this;
}
}
}
}