ES6의 반복자와 반복 가능한 객체의 원리 소개(예제 포함)
이 글은 ES6의 반복자와 반복 가능한 객체의 원리를 소개합니다(예제 포함). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
ES6 새로운 배열 메소드, 컬렉션, for-of 루프, 확산 연산자(...) 및 심지어 비동기 프로그래밍도 모두 반복자(Iterator) 구현에 의존합니다. 이 글에서는 ES6의 반복자와 생성기에 대해 자세히 설명하고 반복 가능한 객체의 내부 원리와 사용법을 더 자세히 살펴보겠습니다.
1. 반복자의 원리
프로그래밍 언어에서 배열이나 컬렉션을 처리할 때 루프 문을 초기화해야 합니다. 변수는 반복 위치를 기록하며, 반복기를 프로그래밍 방식으로 사용하면 이 데이터 작업을 단순화할 수 있습니다.반복기를 디자인하는 방법은 무엇인가요?
반복자 자체는 객체입니다. 이 객체에는 결과 객체를 반환하는 next() 메서드가 있습니다. 이 결과 객체에는 다음 반환 값과 반복 완료 부울 값이 있습니다.
function createIterator(iterms) { let i = 0 return { next() { let done = (i >= iterms.length) let value = !done ? iterms[i++] : undefined return { done, value } } } } let arrayIterator = createIterator([1, 2, 3]) console.log(arrayIterator.next()) // { done: false, value: 1 } console.log(arrayIterator.next()) // { done: false, value: 2 } console.log(arrayIterator.next()) // { done: false, value: 3 } console.log(arrayIterator.next()) // { done: true, value: undefined }
반복자의 next()가 호출될 때마다 다음 데이터 세트가 소진될 때까지 객체가 반환됩니다.
ES6에서 반복자를 작성하는 규칙은 비슷하지만 반복자 객체를 더 쉽게 생성할 수 있도록 생성기 객체가 도입되었습니다.
2. 반복자 생성
ES6은 반복자를 생성하기 위해 생성기를 캡슐화합니다. 분명히 생성기는 함수 뒤에 별표(*)로 표시되는 반복자를 반환하는 함수이며, 새로운 내부 특수 키워드인 Yield를 사용하여 반복자의 next() 메서드 반환 값을 지정합니다.
ES6 생성기를 사용하여 반복자를 만드는 방법은 무엇입니까? 간단한 예는 다음과 같습니다.
function *createIterator() { yield 123; yield 'someValue' } let someIterator = createIterator() console.log(someIterator.next()) // { value: 123, done: false } console.log(someIterator.next()) // { value: 'someValue', done: false } console.log(someIterator.next()) // { value: undefined, done: true }
yield 키워드를 사용하여 값이나 표현식을 반환하고 반복자에 요소를 일괄적으로 추가할 수 있습니다.
// let createIterator = function *(items) { // 生成器函数表达式 function *createIterator(items) { for (let i = 0; i < items.length; i++) { yield items[i] } } let someIterator = createIterator([123, 'someValue']) console.log(someIterator.next()) // { value: 123, done: false } console.log(someIterator.next()) // { value: 'someValue', done: false } console.log(someIterator.next()) // { value: undefined, done: true }
생성기 자체가 함수이므로 객체에 추가할 수 있습니다.
let obj = { // createIterator: function *(items) { // ES5 *createIterator(items) { // ES6 for (let i = 0; i < items.length; i++) { yield items[i] } } } let someIterator = obj.createIterator([123, 'someValue'])
함수 실행을 자동으로 종료하는 이 기능은 다양한 고급 용도로 활용됩니다.
3. 반복 가능한 객체
ES6에서 일반적으로 사용되는 컬렉션 객체(배열, Set/Map 컬렉션)와 문자열은 반복 가능한 객체이며 이러한 객체에는 기본 반복자와 Symbol.iterator 속성이 있습니다.
생성기를 통해 생성된 Iterator는 반복 가능한 객체이기도 합니다. 왜냐하면 생성기는 기본적으로 Symbol.iterator 속성에 값을 할당하기 때문입니다.
3.1 Symbol.iterator
Iterable 객체에는 Symbol.iterator 속성이 있습니다. 즉, Symbol.iterator 속성이 있는 객체에는 기본 반복자가 있습니다.
Symbol.iterator를 사용하여 예를 들어 배열의 경우 객체의 기본 반복자에 액세스할 수 있습니다.
let list = [11, 22, 33] let iterator = list[Symbol.iterator]() console.log(iterator.next()) // { value: 11, done: false }
Symbol.iterator는 배열의 반복 가능한 객체의 기본 반복자를 가져오고 이를 작동하여 배열의 요소를 순회합니다. 정렬.
반대로, 우리는 Symbol.iterator를 사용하여 객체가 반복 가능한 객체인지 여부를 감지할 수 있습니다:
function isIterator(obj) { return typeof obj[Symbol.iterator] === 'function' } console.log(isIterator([11, 22, 33])) // true console.log(isIterator('sometring')) // true console.log(isIterator(new Map())) // true console.log(isIterator(new Set())) // true console.log(isIterator(new WeakMap())) // false console.log(isIterator(new WeakSet())) // false
분명히 배열, Set/Map 컬렉션 및 문자열은 모두 반복 가능한 객체이지만 WeakSet/WeakMap 컬렉션(약한 참조 컬렉션) 반복적이지 않습니다.
3.2 반복 가능한 객체 만들기
기본적으로 사용자 정의 객체는 반복 가능하지 않습니다.
지금 언급한 것처럼 생성기가 생성한 반복자는 기본적으로 Symbol.iterator 속성에 값을 할당합니다.
그렇다면 사용자 정의 객체를 반복 가능한 객체로 바꾸는 방법은 무엇일까요? Symbol.iterator 속성에 생성기를 추가하면:
let collection = { items: [11,22,33], *[Symbol.iterator]() { for (let item of this.items){ yield item } } } console.log(isIterator(collection)) // true for (let item of collection){ console.log(item) // 11 22 33 }
배열 항목은 반복 가능한 객체이고, 컬렉션 객체도 Symbol.iterator 속성에 값을 할당하여 반복 가능한 객체가 됩니다.
3.3 for-of
마지막 밤나무는 for-of 대신 for-of를 사용하는데 이는 반복 가능한 객체를 위해 ES6에 추가된 새로운 기능입니다.
for-of 루프의 구현 원리를 생각해 보세요.
for-of를 사용하는 반복 가능한 객체의 경우 for-of가 실행될 때마다 반복 가능한 객체의 next()가 호출되고 반환 결과가 변수에 저장되며 의 done 속성 값까지 실행이 계속됩니다. 반복 가능한 객체가 false입니다.
// 迭代一个字符串 let str = 'somestring' for (let item of str){ console.log(item) // s o m e s t r i n g }
기본적으로 for-of는 str 문자열의 Symbol.iterator 속성 메서드를 호출하여 반복자를 얻은 다음(이 프로세스는 JS 엔진에서 완료됨) next() 메서드를 여러 번 호출하여 객체 값 값을 저장합니다. 항목 변수에 있습니다.
반복할 수 없는 객체에 for-of를 사용하면 null 또는 정의되지 않음으로 인해 오류가 발생합니다!3.4 스프레드 연산자(...)
ES6 구문 설탕 스프레드 연산자(...)는 반복 가능한 객체도 제공합니다. 즉, 배열, 집합, 문자열 및 사용자 정의 반복 가능한 객체만 "확장"할 수 있습니다.
다음 예제는 다양한 반복 가능한 객체 확장 연산자로 계산된 결과를 출력합니다.
let str = 'somestring' console.log(...str) // s o m e s t r i n g let set = new Set([1, 2, 2, 5, 8, 8, 8, 9]) console.log(set) // Set { 1, 2, 5, 8, 9 } console.log(...set) // 1 2 5 8 9 let map = new Map([['name', 'jenny'], ['id', 123]]) console.log(map) // Map { 'name' => 'jenny', 'id' => 123 } console.log(...map) // [ 'name', 'jenny' ] [ 'id', 123 ] let num1 = [1, 2, 3], num2 = [7, 8, 9] console.log([...num1, ...num2]) // [ 1, 2, 3, 7, 8, 9 ] let udf console.log(...udf) // TypeError: undefined is not iterable
위 코드에서 볼 수 있듯이 확장 연산자(...)는 반복 가능한 객체를 배열로 편리하게 변환할 수 있습니다. for-of와 마찬가지로 확산 연산자(...)는 반복 불가능한 개체, null 또는 정의되지 않은 개체에 사용될 때 오류를 보고합니다!
4. 기본 반복자
ES6 为很多内置对象提供了默认的迭代器,只有当内建的迭代器不能满足需求时才自己创建迭代器。
ES6 的 三个集合对象:Set、Map、Array 都有默认的迭代器,常用的如values()方法、entries()方法都返回一个迭代器,其值区别如下:
entries():多个键值对
values():集合的值
keys():集合的键
调用以上方法都可以得到集合的迭代器,并使用for-of循环,示例如下:
/******** Map ***********/ let map = new Map([['name', 'jenny'], ['id', 123]]) for(let item of map.entries()){ console.log(item) // [ 'name', 'jenny' ] [ 'id', 123 ] } for(let item of map.keys()){ console.log(item) // name id } for (let item of map.values()) { console.log(item) // jenny 123 } /******** Set ***********/ let set = new Set([1, 4, 4, 5, 5, 5, 6, 6,]) for(let item of set.entries()){ console.log(item) // [ 1, 1 ] [ 4, 4 ] [ 5, 5 ] [ 6, 6 ] } /********* Array **********/ let array = [11, 22, 33] for(let item of array.entries()){ console.log(item) // [ 0, 11 ] [ 1, 22 ] [ 2, 33 ] }
此外 String 和 NodeList 类型都有默认的迭代器,虽然没有提供其它的方法,但可以用for-of循环
위 내용은 ES6의 반복자와 반복 가능한 객체의 원리 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

최고의 무료 AI 애니메이션 아트 생성기를 찾고 싶다면 검색을 종료할 수 있습니다. 애니메이션 예술의 세계는 독특한 캐릭터 디자인, 매혹적인 색상, 매혹적인 줄거리로 수십 년 동안 관객을 사로잡았습니다. 그러나 애니메이션 아트를 만드는 데는 재능과 기술, 그리고 많은 시간이 필요합니다. 그러나 인공 지능(AI)의 지속적인 발전으로 이제 최고의 무료 AI 애니메이션 아트 생성기의 도움으로 복잡한 기술을 탐구할 필요 없이 애니메이션 아트의 세계를 탐험할 수 있습니다. 이것은 당신의 창의력을 발휘할 수 있는 새로운 가능성을 열어줄 것입니다. AI 애니메이션 아트 생성기란 무엇입니까? AI 애니메이션 아트 생성기는 정교한 알고리즘과 기계 학습 기술을 활용하여 광범위한 애니메이션 작품 데이터베이스를 분석합니다. 이러한 알고리즘을 통해 시스템은 다양한 애니메이션 스타일을 학습하고 식별합니다.

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

Golang은 빠르고 효율적인 정적으로 컴파일된 언어로, 간결한 구문과 강력한 성능으로 인해 소프트웨어 개발 분야에서 매우 인기가 높습니다. Golang에서 반복자(Iterator)는 컬렉션의 내부 구조를 노출하지 않고 컬렉션의 요소를 순회하기 위해 일반적으로 사용되는 디자인 패턴입니다. 이 글에서는 Golang에서 반복자를 구현하고 사용하는 방법을 자세히 소개하고, 구체적인 코드 예제를 통해 독자의 이해를 돕습니다. 1. iterator의 정의 Golang에서 iterator는 일반적으로 인터페이스와 구현으로 구성됩니다.

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가

Java 프로그래밍에서 Iterator 및 Iterable 인터페이스는 컬렉션의 요소를 처리하는 데 중요한 도구입니다. Iterator 인터페이스는 컬렉션 요소에 대한 반복적인 액세스를 위한 메서드를 제공하는 반면, Iterable 인터페이스는 컬렉션의 요소가 Iterator를 통해 액세스될 수 있도록 컬렉션의 반복성을 정의합니다. 둘 사이의 긴밀한 협력은 컬렉션 요소를 탐색하는 일반적인 방법을 제공합니다. Iterator 인터페이스 Iterator 인터페이스는 다음 메소드를 정의합니다. booleanhasNext(): 컬렉션에 아직 요소가 있는지 확인합니다. Enext(): 컬렉션의 다음 요소를 반환합니다. voidremove(): 현재 요소를 제거합니다. 반복 가능
