ES6 - Iterator 와 for... of 순환
10878 단어 ES6
Iterator 의 옮 겨 다 니 는 과정 은 이 렇 습 니 다.
현재 데이터 구조의 시작 위 치 를 가리 키 는 지침 을 만 듭 니 다.즉, 스 트 리밍 기의 반환 값 은 포인터 대상 이다.포인터 대상 을 처음 호출 하 는 next 방법 은 데이터 구조의 첫 번 째 구성원 에 게 지침 을 가리 킬 수 있 습 니 다.두 번 째 포인터 대상 을 호출 하 는 next 방법 은 데이터 구조의 두 번 째 구성원 을 가리킨다.데이터 구조의 끝 위 치 를 가리 킬 때 까지 포인터 대상 의 next 방법 을 호출 합 니 다.매번 next 방법 을 호출 할 때마다 현재 구성원 의 정 보 를 되 돌려 줍 니 다. 구체 적 으로 말 하면 value 와 done 두 속성 을 포함 하 는 대상 을 되 돌려 줍 니 다.그 중에서 value 속성 은 현재 구성원 의 값 입 니 다. done 속성 은 불 값 입 니 다. 옮 겨 다 니 는 것 이 끝 났 는 지 여 부 를 표시 합 니 다.
function idMaker(){
var index = 0;
return {
next: function(){
return {value: index++, done: false};
}
}
}
var it = idMaker();
it.next().value // '0'
it.next().value // '1'
it.next().value // '2'
데이터 구조의 기본 Iterator 인 터 페 이 스 는 ES6 에서 데이터 구 조 를 교체 할 수 있 습 니 다 (예 를 들 어 배열). 모두 Symbol. iterator 라 는 방법 을 실현 해 야 합 니 다. 이 방법 은 이 구조 요소 의 교체 기 를 되 돌려 줍 니 다.Symbol. iterator 는 Symbol 이 고 Symbol 은 ES6 에 새로 추 가 된 원시 값 형식 입 니 다.
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 }
arr , , arr Symbol.iterator 。 , ,
。
기본 Iterator 인 터 페 이 스 를 호출 하 는 장소
배열 과 set 구 조 를 재 구성 할 때 기본적으로 iterator 인 터 페 이 스 를 호출 합 니 다.
let set = new Set().add('a').add('b').add('c');
let [x,y] = set;
console.log([x,y])
// x='a'; y='b'
let [first, ...rest] = set;
console.log(first,rest)
// first='a'; rest=['b','c'];
확장 연산 자 확장 연산 자 (...) 도 기본 iterator 인 터 페 이 스 를 호출 합 니 다.
//
var str = 'hello';
[...str] // ['h','e','l','l','o'] //
//
let arr = ['b', 'c'];
['a', ...arr, 'd']
// ['a', 'b', 'c', 'd']
다른 경우 아래 의 경우 에 도 기본 iterator 인 터 페 이 스 를 사용 합 니 다.
yield*
Array.from()
Map(), Set(), WeakMap(), WeakSet()
Promise.all(), Promise.race()
원생 은 Iterator 인터페이스 의 데이터 구 조 를 갖 추고 있다.
var someString = "hi";
typeof someString[Symbol.iterator]
// "function"
//
var iterator = someString[Symbol.iterator]();
iterator.next() // { value: "h", done: false }
iterator.next() // { value: "i", done: false }
iterator.next() // { value: undefined, done: true }
Symbol.iterator , next , 。
Symbol.iterator , 。
var str = new String("hi");
[...str] // ["h", "i"]
str[Symbol.iterator] = function() {
return {
next: function() {
if (this._first) {
this._first = false;
return { value: "bye", done: false };
} else {
return { done: true };
}
},
_first: true
};
};
[...str] // ["bye"]
str // "hi"
str Symbol.iterator , (...) bye, hi。
Iterator 인터페이스 와 Generator 함수
ar myIterable = {};
myIterable[Symbol.iterator] = function* () {
yield 1; //
yield 2;
yield 3;
};
[...myIterable] // [1, 2, 3]
//
let obj = {
* [Symbol.iterator]() {
yield 'hello';
yield 'world';
}
};
for (let x of obj) {
document.write(x);
}
// hello
// world
Symbol.iterator , yield
옮 겨 다 니 는 return (), throw () 옮 겨 다 니 는 포인터 대상 은 next 방법 외 에 return 방법 과 throw 방법 도 있 습 니 다.그 중에서 next 방법 은 반드시 배치 해 야 하 며, return 방법 과 throw 방법 은 배치 여 부 를 선택 할 수 있 습 니 다.
return 방법의 사용 장 소 는 for... of 순환 이 미리 종료 되면 return 방법 을 사용 합 니 다.대상 이 옮 겨 다 니 기 전에 자원 을 정리 하거나 방출 해 야 한다 면 return 방법 을 배치 할 수 있 습 니 다.
throw 방법 은 주로 Generator 함수 에 맞 춰 사용 되 며, 일반적인 스 트 리밍 기 는 이 방법 을 사용 할 수 없습니다.
for... of 순환 교체 기 대상 은 CLI IEnumerable 이나 자바 Iterable 처럼 교체 기 를 사용자 정의 할 수 있 습 니 다.for. in 을 사용자 정의 교체 기 기반 의 for. of 와 같은 교체 로 변환 합 니 다. 하나의 배열 을 실현 할 필요 가 없습니다. LINQ 와 같은 타성 디자인 모델 을 지원 합 니 다.
let fibonacci = {
[Symbol.iterator]() {
let pre = 0, cur = 1;
return {
next() {
[pre, cur] = [cur, pre + cur];
return { done: false, value: cur }
}
}
}
}
// , :Symbol.iterator
for (var n of fibonacci) {
// truncate the sequence at 1000
if (n > 1000)
break;
document.write(n);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
(Javascript) ES6의 주요 특징 정리let을 사용하면 선언한 변수는 블록안에서만 유효하게 된다. const 역시 마찬가지로 블록스코프를 따른다 .const 와 let의 차이점은 const 는 상수로 값을 할당한다는 점이다. 따라서 값을 변경시키려고 하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.