js中for..of..和迭代器
for..of是ES6中引入的新特性,它主要的作用是:循环一个可迭代的对象。
它可以循环遍历,数组、字符串、Set对象等等
示例一:
let str = 'hello'
for (item of str) {
console.log(item) // h e l l 0 依次打印
}
示例二:
let arr = [1,2,3,4,5]
for(arrItem of arr){
console.log(arrItem) // 1 2 3 4 5 依次打印
}
示例三:
let obj = {
  x:10,
  y:20
}
for(item of obj){
  console.log(item)  // 错误:“Uncaught TypeError: obj is not iterable”
}
Uncaught TypeError: obj is not iterable : 未捕获的类型错误:obj不可迭代
迭代器
给对象添加一个迭代器
obj[Symbol.iterator] = ()=>{
}
Symbol.iterator
紧接着,我们要在方法里面去写一下迭代规则,就是说,你想怎么去迭代这对象。这个方法需要返回一个next方法,next方法里面,又需要返回一个对象,
并且这个对象里面需要有"done"属性,“done”的值为bool类型的值,它相当于一个条件(或者说是开关),
判断是否需要继续循环,值为true时,跳出循环;值为false继续下一次循环;看个例子:
let obj = {
      x:10,
      y:20
}
obj[Symbol.iterator] = ()=> {
            return {
                next(){
                    return {
                        done: false,
               value:2
                    }
                }
            }
        }
for(objItem of obj){
      console.log(objItem)
 }
上面这个例子,第一次循环的时候,返回{done:false,value:2},打印“2”,第二次、第三次.... done的值一直是false,会出现死循环,一直打印“2”,
我们知道,如果要跳出循环,done的值要等于true,所以,我们可以加一些条件,当把对象遍历完毕之后,跳出循环:
let obj = {
    x:10,
    y:20
}
obj[Symbol.iterator] = ()=> {
    let keys = Object.keys(obj) //获取对象的key值
    let len = keys.length
    let n = 0
    return {
        next(){
            if (n<len){ //继续循环
                return {
                    done: false,
                    value: obj[keys[n++]] // 每次循环返回的值
                }
            } else { // 跳出循环
                return {
                    done: true
                }
            }
        }
    }
}
for(objItem of obj){
    console.log(objItem) // 依次打印 10  20
}
总结:常见的循环方法有,for循环、map()、forEach()、filter()等等,可以发现,每个方法都有自己的规则,比如返回值什么的。
那么,我们可以通过迭代器,去自定义循环规则,通过迭代器,返回自己想要的结果。
js中for..of..和迭代器的更多相关文章
- JS常用的设计模式(12)——  迭代器模式
		
迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示. js中我们经常会封装一个each函数用来实现迭代器. array的迭代器: forEach = functio ...
 - js数组的内部实现,迭代器,生成器和内包
		
js内部实现 在js以外的很多语言中,数组将会隐式占用一段连续的内存空间.这种隐式的内部实现,使得高效的内存使用及高速的元素方法称为可能,而 在javascript中,数组实体是一个对象,所以通常的实 ...
 - 【面试篇】寒冬求职季之你必须要懂的原生JS(中)
		
互联网寒冬之际,各大公司都缩减了HC,甚至是采取了“裁员”措施,在这样的大环境之下,想要获得一份更好的工作,必然需要付出更多的努力. 一年前,也许你搞清楚闭包,this,原型链,就能获得认可.但是现在 ...
 - js  中的yield
		
yield是什么 yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者.它可以被认为是一个基于生成器的版本的return关键字. yield关键字实 ...
 - RxJS 中的观察者和迭代器模式
		
目录 前言 观察者模式 迭代器模式 RxJS 中两种模式的结合和实现 小结 参考 1. 前言 RxJS 是一个库,它通过使用observable(可观察对象)序列来编写异步和基于事件的程序.其结合了观 ...
 - Js中Currying的应用
		
Js中Currying的应用 柯里化Currying是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术,是函数式编程应用. 描述 如果说函数式编程中有两 ...
 - Js中函数式编程的理解
		
函数式编程的理解 函数式编程是一种编程范式,可以理解为是利用函数把运算过程封装起来,通过组合各种函数来计算结果.函数式编程与命令式编程最大的不同其实在于,函数式编程关心数据的映射,命令式编程关心解决问 ...
 - 5.0 JS中引用类型介绍
		
其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...
 - 【repost】JS中的异常处理方法分享
		
我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
 
随机推荐
- 【转帖】Linux图形用户界面:KDE与GNOME的由来
			
Linux图形用户界面:KDE与GNOME的由来 置顶 2018年08月11日 15:51:25 hwpipixia 阅读数 4778 https://blog.csdn.net/u013895853 ...
 - PAT A1019 General Palindromic Number (20 分)
			
AC代码 #include <cstdio> const int max_n = 1000; long long ans[max_n]; int num = 0; void change( ...
 - 线性基求交(2019牛客国庆集训派对day4)
			
题意:https://ac.nowcoder.com/acm/contest/1109/C 问你有几个x满足A,B集合都能XOR出x. 思路: 就是线性基求交后,有几个基就是2^几次方. #defin ...
 - 从入门到自闭之Python--RESTful API规范与序列化
			
RESTful API规范 REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fieldi ...
 - .Net Core 3.0 内置依赖注入:举例
			
原文:.Net Core 3.0 内置依赖注入:举例 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...
 - 题解 POJ1964/UVA1330/SP277 【City Game】
			
题目链接: https://www.luogu.org/problemnew/show/UVA1330 http://poj.org/problem?id=1964 https://www.luogu ...
 - mybatis  插入语句 返回自增长id方法
			
背景:目前有个插入语句需要获取插入记录的id 因为id是自增长的,所以要在插入后返回这个id 错误1: mapper.xml: <!-- 新增 返回自增长id--> <insert ...
 - Centos7:Redis的安装,配置及使用
			
安装依赖与环境 yum install gcc-c++ 解压缩redis 编译,进入redis源码目录 make 安装 make install PREFIX=/usr/local/redis 注:P ...
 - 【Git的基本操作五】比较文件差异
			
比较文件差异 1. git diff [文件名] 将工作区中的文件和暂存区对应文件进行比较 例:git diff test.txt 2. git diff [本地库中文件历史记录(指针)] [文件名] ...
 - Redis-ZSet常用命令
			
Redis-ZSet常用命令 zadd key score member[{score member}-] 创建或设置指定key对应的有序集合,根据每个值对应的score来排名,升序.例如有命令 za ...