博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 自定义迭代器
阅读量:3915 次
发布时间:2019-05-23

本文共 1155 字,大约阅读时间需要 3 分钟。

for…of:根据迭代对象的迭代器具体实现迭代对象数据

话不多说,直接上代码

对数组进行迭代时,取到的是数组的一个个值,对比 for…in(取到的是 key)
let arr = ['a', 'b', 'c']for (let item of arr) {  console.log(item) // a b c}
那如果是对象呢?
let obj = {  a: 100,  b:200}for (let item of obj) {  console.log(item) // obj is not iterable}
报错了:obj is not iterable
首先我们需要知道这是什么意思:obj 是不可迭代的意思很好理解,但什么事可迭代的?什么又是不可迭代的?按照官方来说:	首先我们有一个《迭代协议》,它规定了迭代与实现的逻辑	然后有 迭代器,它是具体的迭代实现逻辑	之后是 迭代对象,它是可被迭代的对象	最后是 迭代语句,我们通过它来进行迭代那么最重要的就是:如何分辨是否是迭代对象?其实很简单:拥有 [Symbol.iterator] 方法就是可迭代的对象。如:
数组的__proto__中就有该方法,所以是可迭代的

数组的__proto__中就有该方法,所以是可迭代的

然而对象中并没有该方法,所以不可迭代报错

然而对象中并没有该方法,所以不可迭代报错

既然我们知道了迭代就是拥有 [Symbol.iterator] 方法的话,那么我们能否自定义迭代呢?

当然是可以的,不然哪有这篇文章,直接上代码吧

let obj = {  a: 100,  b:200}obj[Symbol.iterator] = function() {  let keys = Object.keys(obj)  let len = keys.length  let values = Object.values(obj)  let n = 0  return {    next: function() {        if (n < len) {          return {            value: {k: keys[n], v: values[n++]},            done: false          }        } else {          return {	          value: '',	          done: true // 注意,一旦 done 为 true ,此时的 value 不返回        }      }    }  }}console.log(obj)for (let {k, v} of obj) {  console.log(k, v)  // a 100  // b 200}
此时,是可以迭代的

此时,是可以迭代的

转载地址:http://gxprn.baihongyu.com/

你可能感兴趣的文章
Win10 Terminal + WSL 2 安装配置指南,精致开发体验
查看>>
Xamarin 从零开始部署 iOS 上的 Walterlv.CloudKeyboard 应用
查看>>
【招聘(西安)】深圳市中兴云服务有限公司.NET工程师
查看>>
注意.NET Core进行请求转发问题
查看>>
别“躺”着了,赶紧把「复盘」做起来
查看>>
真正拖垮你的,是沉没成本
查看>>
Docker:恢复对开源项目的无限制访问
查看>>
Blazor 准备好为企业服务了吗?
查看>>
.NET5全面拥抱Azure云,微软市值重回巅峰,那些年吹过的牛,都实现了!
查看>>
C# 中的 ref 已经被放开,或许你已经不认识了
查看>>
C#刷剑指Offer | 【常考题】最小的k个数
查看>>
【专题】多角度深入解析开放原子开源基金会
查看>>
在 Azure App Service 上启用 Application Request Routing
查看>>
使用 Xunit.DependencyInjection 改造测试项目
查看>>
谈谈.NET Core IServiceProvider
查看>>
一个.NET Core下的开源插件框架Pluginfactory
查看>>
基于阿里云日志服务快速打造简版业务监控看板
查看>>
集赞有礼!进击吧! Blazor !第六期 企业内部应用建设实战
查看>>
大象起舞——微软研发如何保持创新力和敏捷性
查看>>
Newbe.ObjectVisitor 0.2.10 发布,更花里胡哨
查看>>