for of

纸飞机 发表于 2021/10/19 00:51:20 2021/10/19
【摘要】 for…of语句在可迭代对象上执行遍历,在 每次遍历中,将不同属性的值( Map是键值 对)分配给变量。 可迭代对象是具有Iterator接口,即含有 [SymboLiterator]属性的数据类型:包括 Array, Map, Set, String, arguments, TypedArray(二进制相关数组)等。 //遍历ar...

for…of语句在可迭代对象上执行遍历,在 每次遍历中,将不同属性的值( Map是键值 对)分配给变量。

可迭代对象是具有Iterator接口,即含有 [SymboLiterator]属性的数据类型:包括 Array, Map, Set, String, arguments, TypedArray(二进制相关数组)等。


  
  1. //遍历array。array的黑犬认[SymboLiterator]是array的values。方法。返回array每项的值的迭代器。
  2. let arr = [1,2,3];
  3. for (let val of arr) {
  4. console.log(val);
  5. }
  6. //123
  7. //遍历arguments
  8. function sum() {
  9. let sum = 0
  10. for(let num of arguments){
  11. sum += num
  12. }
  13. console.log(sum); //15
  14. }
  15. sum(1,2,3,4,5)
  16. //遍历Map, Map的默认[Symbol.iterator]是Map的entries()方法。返回Map键值对迭代器。
  17. var map = new Map()
  18. map.set('a', 'A')
  19. map.set('b', 'B')
  20. map.set('c', 'C')
  21. for(var n of map){
  22. console.log(n)
  23. }
  24. // ['a','A']
  25. // ['b','B']
  26. // ['c','C']
  27. for (let [key, val] of map) {
  28. console.log(val);
  29. }
  30. // 'A''B'C'
  31. //遍历 Set。Set的黑犬认[Symbol.iterator]是Set的values。方法。返回Set值迭代器。
  32. let set = new Set([1,1,2,2,3,3]);
  33. for (let val of set) {
  34. console.log(val);
  35. }
  36. //1 2 3
  37. //遍历由生成器创建的迭代器(iterator)
  38. function *gen(){
  39. yield 1;
  40. yield 2;
  41. yield 3;
  42. }
  43. let iterl = gen();
  44. for (let letter of iterl) {
  45. console.log(letter);
  46. }
  47. //1 2 3
  48. let arr =['a','b','c'];
  49. let iter2 = arr[Symbol.iterator]();
  50. for (let letter of iter2) {
  51. console.log(letter);
  52. }
  53. // a b c

 使用 break、continues return 和 throw 终止循环执行:


  
  1. const iterable = ['a','b','c'];
  2. for (const value of iterable) {
  3. console.log(value);
  4. break;
  5. }
  6. //a (只有a被打印出来)

普通对象非可迭代对象,无法使用for of遍 历 , 如需使用可添加一个[SymboLiterator]属性,并指向一个迭代器生成函数(生成器,或任何可以返回一个 迭代器的函数)即可。


  
  1. let obj = {
  2. "0": "aa",
  3. "2": "cc"
  4. }
  5. obj[ Symbol.iterator ] = function *(){
  6. for( let key in this){
  7. let val = this[key];
  8. yield val;
  9. }
  10. }
  11. for( let i of obj){
  12. console.log(i)
  13. }
  14. //aa
  15. //bb
  16. // cc
  17. 如果是伪数组对象(含索引数属性和length属性)还可直接借用数组的。obj[Symbol.iterator] = [] [Symbol.iterator]

或者使用 Object.keys和Object.entries转 化成数组后再用for of


  
  1. const obj = {
  2. a: 1,
  3. b: 2,
  4. c: 3
  5. }
  6. // Object.keys(obj)输出["a", "b", "c"]
  7. for (var key of Object.keys(obj)) {
  8. console.log(key + ':'+ obj[key])
  9. }
  10. //a: 1
  11. //b:2
  12. //c:3
  13. // Object.entries(obj)输出[["a", 1],["c",3]]
  14. for (let [key, value] of Object.entries(obj)) {
  15. console.log(key,value)
  16. }
  17. //a-1
  18. //b-2
  19. //c-3

for of遍历原理:


  
  1. //先调用可迭代对象iterable内部的Symbol.iterator方法来获取迭代器iterator。然后循环每执行一次都会调用迭代器的next。方法,并将迭代器返回的结果对象中的value性存储在一个变量中,这样不断循环直到返回
  2. 对象的done属性的值为truefor of实际遍历的是迭代器。
  3. var iterator = iterable[Symbol.iterator]();
  4. for(;;){
  5. var result = iterator.next();
  6. if (result.done) break;
  7. var item = result.value;
  8. ...
  9. }

文章来源: root181.blog.csdn.net,作者:前端纸飞机,版权归原作者所有,如需转载,请联系作者。

原文链接:root181.blog.csdn.net/article/details/120147278

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。