ES6 Iterator 달력 원리, 응용 장면 및 관련 상용 지식 확대 상세 설명
Iterator 를 소개 하기 전에 먼저 js 의 데이터 집합 구 조 를 나타 내 는 몇 가지 방식 을 열거 합 니 다.
es6 이전에 Array, Object, es6 에 map, set 가 추가 되 었 습 니 다. 물론 사용자 도 이 몇 가지 데이터 구 조 를 조합 하여 데 이 터 를 유연 하 게 저장 할 수 있 습 니 다.
그러나 데이터 구조 가 복잡 해 지면 안의 데 이 터 를 어떻게 찾 는 지도 상대 적 으로 복잡 하 다. 그러면 데 이 터 를 읽 는 통 일 된 인터페이스 체 제 를 가지 고 서로 다른 데이터 구 조 를 처리 해 야 한다.
스 트 리밍 기 는 바로 이러한 인터페이스 메커니즘 이다. Iterator 는 인터페이스 로 서로 다른 데이터 구조 에 통 일 된 인터페이스 체 제 를 제공한다.
해당 하 는 모든 데이터 구 조 는 Iterator 인 터 페 이 스 를 배치 하면 옮 겨 다 니 기 작업 을 완성 할 수 있다.
Iterator 의 역할:
1. 각종 데이터 구조 에 통일 되 고 간단 한 접근 인 터 페 이 스 를 제공한다.
2. 데이터 구조의 구성원 이 특정한 순서에 따라 배열 할 수 있 도록 한다.
3. ES6 는 새로운 순환 (for... of...) 을 제공 합 니 다. Iterator 는 for... of... 순환 호출 되 었 습 니 다.
Iterator 본질:
스 트 리밍 기 는 본질 적 으로 포인터 대상 이 고 포인터 대상 에 next () 방법 이 있 으 며 몇 번 째 호출 은 몇 번 째 멤버 를 가리킨다.
Iterator 상 next () 방법 호출:
1, 현재 멤버 의 정 보 를 되 돌려 줍 니 다
2. 반복 이 끝 날 지 여 부 를 되 돌려 줍 니 다.
아 날로 그 구현 Iterator
var it = makeIterator(['a', 'b']);
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
}
Typescript 사용 하기
interface Iterable {
[Symbol.iterator]() : Iterator,
}
interface Iterator {
next(value?: any) : IterationResult,
}
interface IterationResult {
value: any,
done: boolean,
}
기본 Iterator 인터페이스:
ES6 에 따 르 면 기본 Iterator 인 터 페 이 스 는 데이터 구조의
Symbol.iterator
속성 에 배치 되 거나 하나의 데이터 구 조 는 Symbol.iterator
속성 만 있 으 면 '옮 겨 다 닐 수 있 는' (iterable) 이 라 고 볼 수 있다.Symbol. iterator 의 본질:
1. Symbol. iterator 자체 가 함수 로 현재 데이터 구조의 기본 적 인 달력 생 성 함수 에 대응 합 니 다.
2. Symbol. iterator 를 실행 하면 스 트 리밍 기 를 되 돌려 줍 니 다.
실례:
const obj = {
[Symbol.iterator] : function () {
return {
next: function () {
return {
value: 1,
done: true
};
}
};
}
};
// Iterator
// obj symbol.iterator ,
원생 iterator 의 데이터 구 조 를 가지 고 있 습 니 다:
Array, Map, Set, String, TypedArray, 함수 의 arglement 대상, NodeList 대상 (노드 대상);
배열 iterator 인 스 턴 스
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }
대상 iterator 인터페이스 구현
class RangeIterator {
constructor(start, stop) {
this.value = start;
this.stop = stop;
}
[Symbol.iterator]() { return this; }
next() {
var value = this.value;
if (value < this.stop) {
this.value++;
return {done: false, value: value};
}
return {done: true, value: undefined};
}
}
function range(start, stop) {
return new RangeIterator(start, stop);
}
for (var value of range(0, 3)) {
console.log(value); // 0, 1, 2
}
메모: 대상 이 iterator 인터페이스 가 없 으 면 원형 체인 에 Iterator 인터페이스 가 있 고 계승 을 통 해 이 인 터 페 이 스 를 가 질 수 있 습 니 다.
사용
while
반복
var $iterator = ITERABLE[Symbol.iterator]();
var $result = $iterator.next();
while (!$result.done) {
var x = $result.value;
// ...
$result = $iterator.next();
}
기본 개념 은 기본적으로 이런 것 이다. 다음은 사용 장면 을 살 펴 보 자.
Iterator 의 사용 필드:
기본 호출 필드:
for... of... 순환, 할당 해제, 확장 연산 자, yield * 키워드
ES6 는 C + +, 자바, C \ # 와 Python 언어 를 참고 하여
for...of
순환 을 도입 하여 모든 데이터 구 조 를 옮 겨 다 니 는 통 일 된 방법 으로 한다.여기 서 는 주로 yield * 를 소개 하 는데, 나머지 몇 개 는 모두 이해 하기 쉽다.
yield*
뒤 에는 옮 겨 다 닐 수 있 는 구조 가 있 는데 이 구조의 옮 겨 다 니 는 인터페이스 가 호출 됩 니 다.
let generator = function* () {
yield 1;
yield* [2,3,4];//
yield 5;
};
var iterator = generator();
iterator.next() // { value: 1, done: false }
iterator.next() // { value: 2, done: false }
iterator.next() // { value: 3, done: false }
iterator.next() // { value: 4, done: false }
iterator.next() // { value: 5, done: false }
iterator.next() // { value: undefined, done: true }
기타 필드:
배열 의 스 트 리밍 은 스 트 리밍 인 터 페 이 스 를 호출 하기 때문에 배열 을 매개 변수 로 받 아들 이 는 모든 경우 스 트 리밍 인 터 페 이 스 를 호출 합 니 다.
new Map([['a',1],['b',2]])
지식 확장:
옮 겨 다 니 는 대상 의 return (), throw ()
return 방법 은 순환 종료 또는 오류 보고 시 호출 합 니 다.
throw
방법 은 주로 Generator 함수 와 결합 하여 사용 합 니 다 (상세 한 것 은 generator 참조)계산 생 성 된 데이터 구조
기 존 데이터 구 조 를 바탕 으로 생 성 된 데이터 구 조 를 계산 합 니 다. 예 를 들 어 Object, Map, Set, Array 의 entries (), keys (), value () 방법 으로 생 성 된 데이터 구 조 는 기본적으로 iterator 인터페이스 가 있 습 니 다.
유사 배열 개체
흔 한 문자열, NodeList 노드 대상, 매개 변수 인수
1. 모든 유사 한 배열 의 대상 이 Iterator 인 터 페 이 스 를 가지 고 있 는 것 은 아니다.
2. 클래스 배열 대상 에 대해 서 는 Array. From () 를 통 해 클래스 배열 대상 을 배열 대상 으로 전환 할 수 있 습 니 다.
3, for - of 는 32 비트 UTF - 16 문 자 를 식별 할 수 있다.
for (let x of 'a\uD83D\uDC0A') {
console.log(x);
}
for - of 와 다른 옮 겨 다 니 는 방법 비교:
for 순환, for Each 순환, for... in... 순환
foreach 순환 중 에 건 너 뛸 수 없 음
for...in
순환 은 몇 가지 단점 이 있다 for...in
순환 은 주로 대상 을 옮 겨 다 니 기 위해 디자인 된 것 으로 배열 에 적용 되 지 않 는 다).for...in
순환 은 문자열 을 키 이름 으로 하 는 '0', '1', '2' 등 이다.for...in
순환 은 디지털 키 이름 뿐만 아니 라 수 동 으로 추 가 된 다른 키 도 옮 겨 다 니 며 원형 체인 의 키 도 포함한다.for...in
순환 은 임의의 순서 로 키 이름 을 옮 겨 다 닙 니 다.for... of...
for...in
그런 단점 이 없다.for...in
, forEach
, break
와 함께 사용 할 수 있다.참고:http://es6.ruanyifeng.com/
관심 있 는 친 구 는 온라인 HTML / CSS / JavaScript 코드 실행 도 구 를 사용 할 수 있 습 니 다.http://tools.jb51.net/code/HtmlJsRun상기 코드 운행 효 과 를 테스트 합 니 다.
더 많은 자 바스 크 립 트 관련 내용 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.,,,,,,,,,,
본 고 에서 말 한 것 이 여러분 의 자 바스 크 립 트 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.