文章目录

  • 先来简单说说for..of与for..in的区别
  • 一般情况下,for..of不能去遍历普通对象
  • 迭代器对象

先来简单说说for…of与for…in的区别

for…in 遍历数组 -> 下标; 遍历对象 -> 键

for…of 遍历数组 -> 值; 遍历对象 -> 无法遍历普通对象

一般情况下,for…of不能去遍历普通对象

原因是: 普通对象没有 Symbol.iterator 属性,如果一个对象拥有 Symbol.iterator 属性,那么就可以使用for … of 遍历了

// 若是想要 for...of 遍历对象,那我们就手动添加 Symbol.iterator 属性
let obj = {data: ['hello', 'one'],[Symbol.iterator]() {const self = this;let index = 0;return {next() {if(index < self.data.length) {return {value: self.data[index++],done: false};}else {return {value: undefined,done: true}}}}}
}
for(let value of obj) {console.log(value);  // world  one
}
// 类似数组的对象遍历  直接引用 Array.prototype[Symbol.iterator]
// 普通对象部署数组的Symbol.iterator方法,并无效果
let iterator = {0: 'a',1: 'b',2: 'c',length: 3,[Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for(let item of iterator) {console.log(item);  // 'a', 'b', 'c'
}

当为对象添加 obj.toString() 方法后,就可以将对象转化为字符串,同样的,向任意对象添加 obj[Symbol.iterator]() 方法,就可以遍历这个 对象了。这个对象也被称为 可迭代的

可通过 Symbol.iterator 方法确定某个数据是否可迭代:

const array = [1, 2, 3];
const iterator = array[Symbol.iterator]();
iterator.next();  // { value: 1, done: false }

for … of 接收可迭代对象,可以遍历 String 、数组、类数组、set、map,包括上面的对象

迭代器对象

for...of 最常见的应用是对数组进行迭代,可以高效地完成迭代,而且无需其他变量来保持索引。

简单了解以下迭代器

迭代器对象是可以拥有任意具有 .next() 方法的对象,for…of 循环将重复调用这个方法,每次循环将重复调用这个方法,每次循环调用一次。

以下是一个简单的迭代器:

let iterator - {[SYmbol.iterator]: function() {return this;},next: function() {return {done: false,value: 0}}
}

每调用一次 .next() 方法,它都返回相同的结果,返回给for…of循环的结果有两个可能:

  • 尚未完成,done: false
  • value为0

这意味着 这个迭代器(iterator) 将会是一个无限循环,当然,平常时用到的迭代器不会这么简单。

迭代器对象也可以实现可选的 .return().throw(exc) 方法。如果for…of循环过早退出会调用 .return() 方法,而异常、break语句 或 return语句均可触发过早退出;

如果迭代器需要执行一些清洁或释放资源的操作,可以在 .return() 方法中实现,大多数迭代器方法无须实现这一方法;

.throw(exc) 方法的使用场景:for…of循环永远不会调用它(这里就不扯远了)

接下来就可以,可以写一个简单的 for…of循环调用重写被迭代的对象:

// for...of 循环
for (let k of iterable) {// 一些语句
}
// 然后使用以下方法和变量实现与之前大致相当的功能
let $iterator = iterable[Symbol.iterator]();
let $result = $iterator.next();
while (!$result.done) {let value = $result.value;// 操作$reslut = $iterator.next();
}

这里没有 .return() 方法,我们可以自己添加上这部分代码,但是这样就扯远了。for…of循环用起来很简单,但是背后的机制略有点复杂

for..of的用法相关推荐

  1. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  2. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  3. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  4. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  5. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  6. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

  7. OpenMP用法大全

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  8. Dorado用法与示例

    Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...

  9. TensorFlow用法

    TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...

  10. TensorFlow Keras API用法

    TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...

最新文章

  1. undefined reference to android log print,undefined reference to '__android_log_print'
  2. 编译安装LAMP之配置httpd以FastCGI方式与php整合
  3. python与excel结合能做什么-机器学习实践:如何将Spark与Python结合
  4. jquery validate验证方法
  5. Spring Boot——自定义多个拦截器(HandlerInterceptor)配置方法与执行顺序
  6. 配置单臂路由、三层交换技术以及动态路由
  7. hdu4405:概率dp
  8. Paxos Made Simple
  9. 导购效果跟踪: SPM
  10. JasperReport学习笔记6-JRXML的标签
  11. zabbix报警系统docker部署,k8s部署,基本使用方法
  12. Pandas系列(十二)实现groupby分组统计
  13. 漫画 | 硬核技术预测你有没有女朋友
  14. Android 呼吸灯流程分析(一)
  15. 主线程启动多个子线程,子线程彼此之间并发执行,互不影响
  16. 阿里品牌数据银行:最全数据银行介绍
  17. 人工智能编程语言介绍
  18. Mac OS 下使用 afconvert 命令,处理音频格式转换
  19. Tile based Rendering 二 tbr and tbdr 优化建议tiled based deferred rendering
  20. ssh localhost失败:Permission denied (publickey).

热门文章

  1. uni-app去掉页面导航栏
  2. 使用javascript获取wx.config内部字段解决微信分享
  3. endnote没有卷号的参考文献怎么整理
  4. 无限幻斗那个服务器人多,无限幻斗英雄系统攻略 英雄系统解析
  5. mysql里面using btree_MySQL - 执行sql报错USING BTREE
  6. CSK与KCF算法推导(六)
  7. linux环境下python读取pdf转docx,docx转txt,txt转excel
  8. 蓝桥杯_基础_美丽的图形
  9. linux自动拉黑服务,CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放...
  10. maximum xor subarray以及xor + trie专题