ES6에는 "for of" 루프라는 새로운 루프 문이 있습니다. "for..of" 문은 전체 객체를 반복할 수 있으며 반복자에 의해 생성된 일련의 값의 루프입니다. "for..of" 루프의 값은 반복 가능해야 하며, "for(배열의 현재 값){...}" 구문. for-of 루프는 배열을 지원할 뿐만 아니라 대부분의 배열과 유사한 객체도 지원합니다. 또한 문자열 순회를 지원하고 문자열을 일련의 유니코드 문자로 순회합니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, ECMAScript 버전 6, Dell G3 컴퓨터.
과거에는 for 루프와 for in 루프가 있었지만 ES6에는 새로운 루프가 있습니다. for of 루프: 전체 객체를 탐색(반복, 루프)합니다.
ES6에는 반복자에서 일련의 값을 생성하는 루프인 새로운 for..of
루프가 추가되었습니다. for..of
루프의 값은 반복 가능
이어야 합니다. for..of
循环,在迭代器生产的一系列值的循环。for..of
循环的值必须是一个iterable
。
var a = ["a", "b","c","d","e"] for(var idx in a){ console.log(idx) } // 0 1 2 3 4 for(var val of a){ console.log(val) } // a b c d e
for..in
在数组a
的键/索引上循环,for..of
在a
的值上循环。【相关推荐:javascript视频教程、web前端】
<span style="font-size: 18px;">ES6</span>
之前的代码var a = ["a", "b","c","d","e"] for(var val, ret, it = a[Symbol.iterator]();(ret=it.next()) && !ret.done){ val = ret.value console.log(val) } // a b c d e
在底层,
for..of
循环向iterable请求一个迭代器,然后反复调用这个迭代器把它产生的值赋给循环迭代变量。
JavaScript
默认为iterable的标准内建值包括:
Array
Strings
Generators
Collections/TypedArrays
for(var c of "hello"){ console.log(c) } // h e l l o
原生字符串值被强制类型转换到等价的String封装对象中,它是一个iterable
<span style="font-size: 18px;">for(XYZ of ABC)</span>
对于XYZ
这个位置既可以是赋值表达式,也可以是声明。下面看个赋值表达式的例子:
var o = {} for(o.a of [1,2,3]){ console.log(o.a) } o // {a:3} for({x:o.a} of [{x:1},{x:2},{x:3}]){ console.log(o.a) } o // {a:3}
通过break
,continue
,return
提前终止循环。
通过对底层的了解,for..of
向iterable
请求一个迭代器,然后反复调用这个迭代器把它产生的值赋给循环迭代变量。那么我可以自定义一个iterable
。
var o = { [Symbol.iterator](){ return this }, next(){ if(!val){ val = 1 }else{ val ++ } return {value:val, done:val== 6} } } for(var val of o[Symbol.iterator]()){ console.log(val) }
由此可见,自定义迭代器满足两个条件,[Symbol.iterator]
属性,返回的对象中有next
方法,next
方法返回值必须是{value:xx,done:xx}
的形式,如果遇到done:true
const arr = ['a', 'b', 'c']; const 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 }
for..in
은 a
배열의 키/인덱스, a
의 for..of
를 반복합니다. > 값을 반복합니다. [관련 권장사항: javascript 비디오 튜토리얼, 웹 프런트 엔드】window.onload=function(){ const arr = [55,00, 11, 22]; arr.name = "hello"; // Array.prototype.FatherName = 'FatherName'; /*for(let key in arr){ console.log('key='+key+',key.value='+arr[key]); }*/ /* arr.forEach((data) => {console.log(data);});*/ /* arr.forEach((data,index,arr) => {console.log(data+','+index+','+arr);});*/ /*for(let key of arr){ console.log(key); }*/ var string1 = 'abcdefghijklmn'; var string2 = 'opqrstuvwxyc'; const stringArr = [string1,string2]; for(let key of stringArr){ console.log(key); } for(let key of string1){ console.log(key); } }
for..of
루프는 iterable에서 반복자를 요청한 다음 이 반복자를 반복적으로 호출하여 생성합니다. 값은 루프 반복 변수에 할당됩니다. JavaScript
기본적으로 반복 가능으로 설정되는 표준 내장 값은 다음과 같습니다. Array
Strings
생성기</code code></li><li><code>Collections/TypedArrays
var s1 = new Set(); // 空Set var s2 = new Set([1, 2, 3]); // 含1, 2, 3
반복 가능
🎜🎜for(XYZ of ABC)🎜
🎜🎜입니다. 🎜XYZ
의 경우 이 위치는 할당 표현식이나 명령문이 될 수 있습니다. 할당 표현식의 예를 살펴보겠습니다. 🎜var s = new Set([1, 2, 3, 3, '3']); console.log(s); // Set {1, 2, 3, "3"}
break
, continue
, return
을 통해 루프를 조기에 종료합니다. 🎜for..of
는 iterable
에 요청합니다. 그런 다음 이 반복자를 반복적으로 호출하여 생성된 값을 루프 반복 변수에 할당합니다. 그런 다음 iterable
을 맞춤설정할 수 있습니다. 🎜var s = new Set([1, 2, 3]); s.add(4); s; // Set {1, 2, 3, 4} s.add(4); s; // Set {1, 2, 3, 4}
[Symbol.iterator]
속성 두 가지 조건을 만족하고 반환된 객체에 next
메서드인 next가 있음을 알 수 있습니다.
메서드의 반환 값은 {value:xx,done:xx}
형식이어야 합니다. done:true
가 발생하면 루프가 종료됩니다. . 🎜🎜결론: 위 내용은 반복 가능한 객체를 반복할 수 있는 for..of 루프의 전체 내용입니다. 🎜🎜🎜지식 확장: for-of가 도입된 이유는 무엇인가요? 🎜🎜🎜이 질문에 답하기 위해 먼저 ES6 이전의 세 가지 for 루프의 단점을 살펴보겠습니다. 🎜🎜🎜forEach는 중단 및 반환이 불가능합니다. 🎜🎜for-in은 요소를 순회할 뿐만 아니라 배열, 사용자 정의 속성도 순회하며 프로토타입 체인의 속성에도 액세스됩니다. 또한 배열 요소가 순회되는 순서는 무작위일 수 있습니다. 🎜🎜🎜그래서 위의 결함을 고려하여 원본 for 루프를 개선해야 합니다. 하지만 ES6은 여러분이 작성한 JS 코드를 깨뜨리지 않습니다. 오늘날 수천 개의 웹 사이트가 for-in 루프에 의존하고 있으며 일부는 배열 순회에도 사용합니다. for-in 루프를 수정하여 배열 탐색 지원을 추가하면 더욱 혼란스러워질 수 있으므로 표준 위원회는 현재 문제인 for-of 를 해결하기 위해 ES6에 새로운 루프 구문을 추가했습니다. 🎜🎜그러면 for-of는 정확히 무엇을 할 수 있나요? 🎜🎜🎜forEach에 비해 break, continue, return에 올바르게 응답할 수 있습니다. 🎜🎜for-of 루프는 배열뿐만 아니라 DOM nodelist 개체와 같은 배열과 유사한 대부분의 개체도 지원합니다. 🎜🎜for-of 루프는 문자열을 일련의 유니코드 문자로 탐색하는 문자열 탐색도 지원합니다. 🎜🎜for-of는 Map 및 Set(ES6의 새로운 유형 모두) 객체 탐색도 지원합니다. 🎜🎜🎜요약하자면 for-of 루프의 특징은 다음과 같습니다. 🎜但需要注意的是,for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用
for-in 循环(这也是它的本职工作)。
最后要说的是,ES6 引进的另一个方式也能实现遍历数组的值,那就是 Iterator。上个例子:
const arr = ['a', 'b', 'c']; const 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 }
前面的不多说,重点描述for-of
for-of循环不仅支持数组,还支持大多数类数组对象,例如DOM NodeList对象。
for-of循环也支持字符串遍历,它将字符串视为一系列的Unicode字符来进行遍历:
window.onload=function(){ const arr = [55,00, 11, 22]; arr.name = "hello"; // Array.prototype.FatherName = 'FatherName'; /*for(let key in arr){ console.log('key='+key+',key.value='+arr[key]); }*/ /* arr.forEach((data) => {console.log(data);});*/ /* arr.forEach((data,index,arr) => {console.log(data+','+index+','+arr);});*/ /*for(let key of arr){ console.log(key); }*/ var string1 = 'abcdefghijklmn'; var string2 = 'opqrstuvwxyc'; const stringArr = [string1,string2]; for(let key of stringArr){ console.log(key); } for(let key of string1){ console.log(key); } }
结果:
现在,只需记住:
for-in循环用来遍历对象属性。
for-of循环用来遍历数据—例如数组中的值。
它同样支持Map和Set对象遍历。
Map和Set对象是ES6中新增的类型。ES6中的Map和Set和java中并无太大出入。
Set
和Map
类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set
中,没有重复的key。
要创建一个Set
,需要提供一个Array
作为输入,或者直接创建一个空Set
:
var s1 = new Set(); // 空Set var s2 = new Set([1, 2, 3]); // 含1, 2, 3
重复元素在Set中自动被过滤:
var s = new Set([1, 2, 3, 3, '3']); console.log(s); // Set {1, 2, 3, "3"}
通过add(key)
方法可以添加元素到Set
中,可以重复添加,但不会有效果:
var s = new Set([1, 2, 3]); s.add(4); s; // Set {1, 2, 3, 4} s.add(4); s; // Set {1, 2, 3, 4}
通过delete(key)
方法可以删除元素:
var s = new Set([1, 2, 3]); s; // Set {1, 2, 3} s.delete(3); s; // Set {1, 2}
Set对象可以自动排除重复项
var string1 = 'abcdefghijklmn'; var string2 = 'opqrstuvwxyc'; var string3 = 'opqrstuvwxyc'; var string4 = 'opqrstuvwxyz'; const stringArr = [string1,string2,string3,string4]; var newSet = new Set(stringArr); for(let key of newSet){ console.log(key); }
结果:
Map对象稍有不同:内含的数据由键值对组成,所以你需要使用解构(destructuring)来将键值对拆解为两个独立的变量:
for (var [key, value] of phoneBookMap) { console.log(key + "'s phone number is: " + value); }
示例
var m = new Map([[1, 'Michael'], [2, 'Bob'], [3, 'Tracy']]); var map = new Map([['1','Jckey'],['2','Mike'],['3','zhengxin']]); map.set('4','Adam');//添加key-value map.set('5','Tom'); map.set('6','Jerry'); console.log(map.get('6')); map.delete('6'); console.log(map.get('6')); for(var [key,value] of map) { console.log('key='+key+' , value='+value); }
结果:
위 내용은 es6의 새로운 루프는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!