let range = {
from: 1,
to: 5
};
위 코드는 아직 이터러블하게 동작하지 않음..
➡️ Symbol.iterator 매서드를 이용하여 이터러블하게 변경해보자 !!
let range = {
from: 1,
to: 5,
[Symbol.iterator]() { //Symbol.iterator 매서드 사용
this.current = this.from;
return this;
}, // 이터레이터 객체를 반환
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
for (let num of range) {
console.log(num); // 1, 2, 3, 4, 5
}
결과
➡️ iterable 한 객체가 아니지만 range 객체 안에 Symbol.iterator 넣어줌으로써 이터레이터 객체를 반환 ( iterable한 객체로 변환 )
let arrayLike = { // 인덱스와 length프로퍼티가 있음 ➡️ 유사 배열
0: "Hello",
1: "World",
length: 2
};
// Symbol.iterator가 없으므로 에러 발생 ➡️ iterable 객체가 아니다
for (let item of arrayLike) {}
: 이터러블이나 유사배열을 받아 " 진짜 Array "를 만들어 줌
➡️ 이터러블이나 유사배열에도 배열 메서드를 사용할 수 있는 것 !!
let arrayLike = {
0: "Hello",
1: "World",
length: 2
};
let arr = Array.from(arrayLike); // (*) 진짜 Array를 만들어줌 !!
// [ "Hello","World" ]
alert(arr.pop()); // World (메서드가 제대로 동작합니다.)
const argsArr = Array.from(argumentsObj);
expect(Array.isArray(argsArr)).to.deep.equal(true);
expect(argsArr).to.deep.equal(["first", "second","third"]);
expect(argsArr === restParams).to.deep.equal(false);