도입부 Iterator
Iterator 의 역할 은 세 가지 가 있 습 니 다. 하 나 는 각종 데이터 구 조 를 위해 통일 적 이 고 간편 한 방문 인 터 페 이 스 를 제공 하 는 것 입 니 다.둘째, 데이터 구조의 구성원 들 이 특정한 순서에 따라 배열 할 수 있 도록 하 는 것 이다.셋째, ES6 는 새로운 옮 겨 다 니 는 명령 for... of 순환 을 만 들 었 고 Iterator 인 터 페 이 스 는 주로 for... of 소 비 를 제공 합 니 다.
Iterator 의 옮 겨 다 니 는 과정 은 이 렇 습 니 다.
(1) 현재 데이터 구조의 시작 위 치 를 가리 키 는 포인터 대상 을 만 듭 니 다.즉, 스 트 리밍 대상 은 본질 적 으로 지침 대상 이다.
(2) 포인터 대상 을 처음 호출 하 는 next 방법 은 데이터 구조의 첫 번 째 구성원 에 게 지침 을 가리 킬 수 있다.
(3) 두 번 째 포인터 대상 을 호출 하 는 next 방법 은 데이터 구조의 두 번 째 구성원 을 가리킨다.
(4) 데이터 구조의 끝 위 치 를 가리 킬 때 까지 포인터 대상 의 next 방법 을 계속 호출 합 니 다.
매번 next 방법 을 호출 할 때마다 데이터 구조의 현재 구성원 의 정 보 를 되 돌려 줍 니 다.구체 적 으로 말 하면 value 와 done 두 속성 을 포함 하 는 대상 을 되 돌려 주 는 것 이다.그 중에서 value 속성 은 현재 구성원 의 값 입 니 다. done 속성 은 불 값 입 니 다. 옮 겨 다 니 는 것 이 끝 났 는 지 여 부 를 표시 합 니 다.
ES6 에 따 르 면 기본 Iterator 인 터 페 이 스 는 데이터 구조의 Symbol. iterator 속성 에 배치 되 어 있 으 며, Symbol. iterator 방법 이 스 트 리밍 기 생 성 함수 가 아 닌 경우 오류 가 발생 할 수 있 습 니 다.
원생 Iterator 인 터 페 이 스 를 갖 춘 데이터 구 조 는 다음 과 같다.Array Map Set String TypedArray 함수 의 arguments 대상 NodeList 대상
우 리 는 배열 의 Symbol. iterator 속성 을 클래스 배열 에 부여 하고 확장 연산 자 를 사용 하여 클래스 배열 을 바 꿀 수 있 습 니 다.
Iterator 인터페이스 구현
Object.defineProperty(myObject, Symbol.iterator, {
enumerable: false,
writable:false,
configurable:false,
value:function(){
let o = this;
let idx = 0;
let ks = Object.keys(o);
return {
next:function(){
return {
value:o[ks[idx++]],
done:(idx>ks.length)
}
}
}
}
});
사실 더 간단 하고 거 친 실현 방식 도 있 습 니 다. Generator 함수 로
let myIterable = {
[Symbol.iterator]: function* () {
yield 1; //
yield 2;
yield 3;
}
}
[...myIterable] // [1, 2, 3]
옮 겨 다 니 는 next 방법 이 가장 중요 하지만 return 과 throw 방법 이 있 습 니 다. return 방법의 사용 장 소 는 for.. of 순환 이 앞 당 겨 종료 되면 return 방법 을 사용 합 니 다.대상 이 옮 겨 다 니 기 전에 자원 을 정리 하거나 방출 해 야 한다 면 return 방법 을 배치 할 수 있 습 니 다.
function readLinesSync(file) {
return {
[Symbol.iterator]() {
return {
next() {
return { done: false };
},
return() {
file.close();
return { done: true };
}
};
},
};
}
// return
// , return ,
for (let line of readLinesSync(fileName)) {
console.log(line);
break;
}
// , return ,
for (let line of readLinesSync(fileName)) {
console.log(line);
continue;
}
// return ,
for (let line of readLinesSync(fileName)) {
console.log(line);
throw new Error();
}
ES6 의 배열, Set, Map 은 모두 다음 과 같은 세 가지 방법 을 배 치 했 습 니 다. 호출 후 모두 스 트 리밍 대상 (Object. keys 등 은 그들 과 달리 배열) entries () 는 스 트 리밍 대상 을 되 돌려 주 고 [키 이름, 키 값] 으로 구 성 된 배열 을 옮 겨 다 닙 니 다.keys () 는 모든 키 이름 을 옮 겨 다 니 는 데 사용 할 스 트 리밍 대상 을 되 돌려 줍 니 다.values () 는 모든 키 값 을 옮 겨 다 니 는 데 사용 할 옮 겨 다 니 는 대상 을 되 돌려 줍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[2022.04.19] 자바스크립트 this - 생성자 함수와 이벤트리스너에서의 this18일에 this에 대해 공부하면서 적었던 일반적인 함수나 객체에서의 this가 아닌 오늘은 이벤트리스너와 생성자 함수 안에서의 this를 살펴보기로 했다. new 키워드를 붙여 함수를 생성자로 사용할 때 this는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.