JavaScript 클래스 배열 및 반복 가능한 객체의 구현 원리에 대한 자세한 설명
이 기사는 객체 자체를 반복자, 문자열 반복자 등으로 구성하는 것을 포함하여 클래스 배열 및 반복 가능 객체의 구현 원리를 주로 소개하는 javascript에 대한 관련 지식을 제공합니다. 아래에서 살펴보겠습니다. 모두에게 도움이 될 것입니다.
[관련 권장 사항: javascript 비디오 튜토리얼, web front-end]
Iterable 객체(Iterable 객체)
배열은 특별한 객체이며 일반 객체와의 차이점은 순서뿐만이 아닙니다. 요소의 액세스, 저장. 또 다른 중요한 차이점은 배열이 반복 가능하다는 점입니다. 즉, for ... of
문을 사용하여 모든 요소에 액세스(반복)할 수 있습니다. for ... of
语句访问(迭代)所有的元素。
我们可以简单的做一个小实验:
let arr = [1,2,3,4,5]for(let val of arr){ console.log(val)}
代码执行结果:
以上代码就简单的使用了数组的迭代特性,我们在访问数组元素的时候,不必使用元素的下标。
如果我们对一个普通对象使用for ... of
语句会发生什么呢?
let obj = { name:'xiaoming', age:12,}for(let para of obj){ //代码会报错 console.log(para)}
执行效果如下:
这就证明普通的对象和数组之间还有一个可迭代的差距,我们称具备迭代功能的对象为可迭代对象。
Symbol.iterator
如果我们希望一个对象可以迭代,必须为对象添加一个名为Symbol.iterator
的方法(一个专门使对象可迭代的内建Symbol
)。
方法作用包括:
- 当使用
for ... of
循环迭代对象时,就会调用Symbol.iterator
方法,这个方法必须返回一个迭代器(一个有next()
方法的对象)。 - 得到迭代器后,
for ... of
会不断的调用迭代器的next()
方法获得下一个元素。 -
next()
方法返回的内容必须符合格式:{done:Boolean,value:any}
,当done:true
时,循环结束,否则value
就是下一个值。
迭代器:
迭代器是借鉴
C++
等语言的概念,迭代器的原理就像指针一样,它指向数据集合中的某个元素,你可以获取它指向的元素,也可以移动它以获取其它元素。迭代器类似于数组中下标的拓展,各种数据结构,如链表(List
)、集合(Set
)、映射(Map
)都有与之对应的迭代器。
JS
中的迭代器是专门为了遍历这一操作设计的。每次获取到的迭代器总是初始指向第一个元素,并且迭代器只有next()
一种行为,直到获取到数据集的最后一个元素。我们无法灵活移动迭代器的位置,所以,迭代器的任务,是按某种次序遍历数据集中的元素。
实现一个可迭代对象:
let obj = { from:1, to:5,}obj[Symbol.iterator] = function(){ //返回一个迭代器 return { current:this.from, last:this.to, next(){ if(this.current<this.last><p>代码执行效果:</p> <p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/067/05759c456d9c107fab3194b506d39378-4.png" class="lazy" alt="JavaScript 클래스 배열 및 반복 가능한 객체의 구현 원리에 대한 자세한 설명"></p> <p>注意,以上对象虽然可以进行迭代了,但是,迭代使用使用的材料并非对象,而是<code>Symbol.iterator</code>返回的迭代器(也是一个对象)。</p> <h2 id="把对象本身构造成迭代器">把对象本身构造成迭代器</h2> <p>以上代码构造了一个内建函数<code>Symbol.iterator()</code>,这个函数返回了一个迭代器对象。我们还可以采用另外一种实现迭代器的方式:把对象本身做成迭代器:</p> <pre class="brush:php;toolbar:false">let obj = { from:1, to:5, [Symbol.iterator](){ this.current = this.from; return this;//返回对象本身 }, next(){//给对象添加一个next方法 if(this.current<this.to><p>代码执行效果和上面的图片展示相同。</p> <blockquote><p>这么做虽然代码更加简洁了,但是由于并没有新的可迭代对象产生,我们就没有办法同时执行两个<code>for ... of</code>循环迭代同一个对象了,但是两个并行的迭代在同一个对象上是非常罕见的。</p></blockquote> <p>我们可以总结可迭代对象的概念:</p> <p>所谓可迭代对象,就是比普通对象多了一个名为<code>Symbol.iterator</code>方法的普通对象,这个方法返回一个迭代器。</p> <p>或者,一个具备<code>Symbol.iterator</code>同时具备<code>next</code>方法的对象也是一个可迭代的对象。</p> <h2 id="String也是可迭代的">String也是可迭代的</h2> <p>数组和字符串都是可以迭代的,我们可以很方便的使用<code>for...of</code></p>간단히 작은 실험을 해볼 수 있습니다: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">let str = '123'for(let c of str){ console.log(c)}

for ... of
문을 사용하면 어떻게 될까요? 🎜Rlet str = '...'for(let c of str){ console.log(c)}
Symbol.iterator
라는 메서드를 객체에 추가해야 합니다(특별히 내장된 Symbol
). 객체를 반복 가능한 코드로 만듭니다>). 🎜🎜메서드 함수에는 다음이 포함됩니다: 🎜-
for ... of
루프를 사용하여 객체를 반복할 때Symbol.iterator
메서드가 호출됩니다. 이 메소드는 Iterator(next()
메소드가 있는 객체)를 반환해야 합니다. - 반복자를 가져온 후
for ... of
는 다음 요소를 얻기 위해 반복자의next()
메서드를 계속 호출합니다. -
next()
메서드에서 반환된 콘텐츠는{done:Boolean,value:any}
형식을 준수해야 합니다. done:true, 루프가 종료되고, 그렇지 않으면값
이 다음 값입니다.
🎜Iterator: 🎜🎜Iterator는🎜반복 가능한 객체 구현: 🎜C++
와 같은 언어에서 빌려온 개념입니다. 반복자의 원리는 포인터와 같습니다. 데이터 컬렉션 요소의 특정 지점으로 이동하면 해당 요소가 가리키는 요소를 가져오거나 다른 요소를 가져오기 위해 이동할 수 있습니다. 반복자는 배열, 연결된 목록(List
), 집합(Set
), 지도(Map
)와 같은 다양한 데이터 구조에서 첨자를 확장하는 것과 유사합니다. code> )에는 해당 반복자가 있습니다. 🎜🎜JS
의 반복자는 순회 작업을 위해 특별히 설계되었습니다. 매번 얻은 반복자는 항상 처음에 첫 번째 요소를 가리키며, 반복자는 데이터 세트의 마지막 요소를 얻을 때까지next()
라는 한 가지 동작만 수행합니다. 반복자의 위치를 유연하게 이동할 수 없으므로 반복자의 작업은 특정 순서로 데이터 세트의 요소를 순회하는 것입니다. 🎜
let str = '12345'let itr = str[Symbol.iterator]()while(true){ let result = itr.next() if(result.done)break; console.log(result.value)}

Symbol.iterator
에서 반환된 반복자입니다( 또한 객체). 🎜🎜객체 자체를 반복자로 구성합니다🎜🎜위 코드는 반복자 객체를 반환하는 내장 함수 Symbol.iterator()
를 구성합니다. 반복자를 구현하는 다른 방법을 사용할 수도 있습니다. 객체 자체를 반복자로 만듭니다. 🎜let str = '123'let arr = Array.from(str)console.log(arr)
🎜이렇게 하면 코드가 더 간결해지지만 새로운 반복 가능한 객체가 생성되지 않으므로 동일한 객체를 반복하기 위해 두 개의 for...of
루프를 동시에 실행할 수 없습니다. , 그러나 동일한 객체에 대한 두 개의 병렬 반복은 매우 드뭅니다. 🎜
🎜반복 가능한 객체의 개념을 요약할 수 있습니다. 🎜🎜소위 반복 가능한 객체는 일반 객체보다 Symbol.iterator
라는 메서드가 하나 더 있는 일반 객체입니다. . 🎜🎜또는 Symbol.iterator
및 next
메서드가 있는 객체도 반복 가능한 객체입니다. 🎜🎜문자열도 반복 가능합니다.🎜🎜배열과 문자열 모두 반복 가능합니다. for...of
문을 사용하여 배열의 문자 요소를 쉽게 반복할 수 있습니다. 🎜let str = '123'for(let c of str){ console.log(c)}
这对于代理对(UTF-16
扩展字符)同样是有效的:
let str = '...'for(let c of str){ console.log(c)}
执行效果如下:
String的迭代器
并非只有for...of
语句能够使用迭代器,我们还可以显式的调用迭代器:
let str = '12345'let itr = str[Symbol.iterator]()while(true){ let result = itr.next() if(result.done)break; console.log(result.value)}
代码执行效果:
以上代码执行了遍历字符串字符的操作,是不是觉得可迭代对象就没有这么神秘了!
类数组对象和可迭代对象
类数组和可迭代在遍历功能上非常相似,都可以方便的方式内部元素,但是二者仍然有明显的区别:
-
iterable
可迭代对象:实现了Symbol.iterator
的对象; -
array-like
类数组对象:具有数字索引,并且有length
属性;
字符串就是一个即使类数组又是可迭代的对象。
可迭代和类数组对象通常都不是数组,如果我们想把一个可迭代或者类数组对象转为数组,需要使用Array.from
方法。
Array.from
使用Array.from
将字符串转为数组:
let str = '123'let arr = Array.from(str)console.log(arr)
代码执行效果如下:
把自定义的类数组对象转为数组:
let obj = { 0:'0', 1:'1', 2:'2', length:3}let arr = Array.from(obj)console.log(arr)
代码执行结果:
Array.from
的完整语法:
Array.from(obj[, mapFunc, thisArg])
mapFunc
方法会在生成数组之前对每个可迭代或类数组元素调用,如果mapFunc
是一个成员方法,可以使用thisArg
提供this
指针。
举个例子:
let str = '12345'let arr = Array.from(str,itm=>+itm)console.log(arr)
代码执行结果:
这里通过映射函数,将本应该生成字符数组转为数字数组。
总结
- 可以使用
for...of
语法的对象被称为可迭代对象 - 可迭代对象是在普通对象的基础上实现了
Symbol.iterator
方法的对象 -
Symbol.iterator
方法返回了一个迭代器; - 迭代器包含一个
next
方法,该方法返回下一个元素的值; -
next
方法返回值需要满足格式{done:Boolean,value:nextVal}
,当done:true
时,迭代结束 Array.from
可以把类数组和可迭代对象转为数组;
【相关推荐:javascript视频教程、web前端】
위 내용은 JavaScript 클래스 배열 및 반복 가능한 객체의 구현 원리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++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. 웹소켓 기술

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 소개: 인터넷의 대중화와 기술의 발전으로 점점 더 많은 레스토랑에서 온라인 주문 서비스를 제공하기 시작했습니다. 실시간 온라인 주문 시스템을 구현하기 위해 JavaScript 및 WebSocket 기술을 사용할 수 있습니다. WebSocket은 TCP 프로토콜을 기반으로 하는 전이중 통신 프로토콜로 클라이언트와 서버 간의 실시간 양방향 통신을 실현할 수 있습니다. 실시간 온라인 주문 시스템에서는 사용자가 요리를 선택하고 주문을 하면

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 오늘날의 디지털 시대에는 점점 더 많은 기업과 서비스에서 온라인 예약 기능을 제공해야 합니다. 효율적인 실시간 온라인 예약 시스템을 구현하는 것이 중요합니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까? WebSocket은 단일 TCP 연결의 전이중 방식입니다.

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

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

사용법: JavaScript에서 insertBefore() 메서드는 DOM 트리에 새 노드를 삽입하는 데 사용됩니다. 이 방법에는 삽입할 새 노드와 참조 노드(즉, 새 노드가 삽입될 노드)라는 두 가지 매개 변수가 필요합니다.

JavaScript는 웹 개발에 널리 사용되는 프로그래밍 언어인 반면 WebSocket은 실시간 통신에 사용되는 네트워크 프로토콜입니다. 두 가지의 강력한 기능을 결합하면 효율적인 실시간 영상 처리 시스템을 만들 수 있습니다. 이 기사에서는 JavaScript와 WebSocket을 사용하여 이 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 첫째, 실시간 영상처리 시스템의 요구사항과 목표를 명확히 할 필요가 있다. 실시간 이미지 데이터를 수집할 수 있는 카메라 장치가 있다고 가정해 보겠습니다.
