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..和迭代器的更多相关文章

  1. JS常用的设计模式(12)—— 迭代器模式

    迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示. js中我们经常会封装一个each函数用来实现迭代器. array的迭代器: forEach = functio ...

  2. js数组的内部实现,迭代器,生成器和内包

    js内部实现 在js以外的很多语言中,数组将会隐式占用一段连续的内存空间.这种隐式的内部实现,使得高效的内存使用及高速的元素方法称为可能,而 在javascript中,数组实体是一个对象,所以通常的实 ...

  3. 【面试篇】寒冬求职季之你必须要懂的原生JS(中)

    互联网寒冬之际,各大公司都缩减了HC,甚至是采取了“裁员”措施,在这样的大环境之下,想要获得一份更好的工作,必然需要付出更多的努力. 一年前,也许你搞清楚闭包,this,原型链,就能获得认可.但是现在 ...

  4. js 中的yield

    yield是什么 yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者.它可以被认为是一个基于生成器的版本的return关键字. yield关键字实 ...

  5. RxJS 中的观察者和迭代器模式

    目录 前言 观察者模式 迭代器模式 RxJS 中两种模式的结合和实现 小结 参考 1. 前言 RxJS 是一个库,它通过使用observable(可观察对象)序列来编写异步和基于事件的程序.其结合了观 ...

  6. Js中Currying的应用

    Js中Currying的应用 柯里化Currying是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术,是函数式编程应用. 描述 如果说函数式编程中有两 ...

  7. Js中函数式编程的理解

    函数式编程的理解 函数式编程是一种编程范式,可以理解为是利用函数把运算过程封装起来,通过组合各种函数来计算结果.函数式编程与命令式编程最大的不同其实在于,函数式编程关心数据的映射,命令式编程关心解决问 ...

  8. 5.0 JS中引用类型介绍

    其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...

  9. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

随机推荐

  1. 【Python】【demo实验32】【回文数的确认】

    原题: 我的代码: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- #判断一个数字是否为回文数 即 12345654321 x = ...

  2. centos7安装oracle1201c

    root身份安装依赖包: yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*.i686 el ...

  3. GCD和LCM

    GCD _ LCM 是给你两个数A B 的最大公约数, 以及最小公倍数 the greatest common divisor and the least common multiply ! 最大公约 ...

  4. PAT B1011 A+B 和 C (15)

    AC代码 #include <cstdio> int main() { int T, tcase = 1; scanf("%d", &T); for(int i ...

  5. 【NOIP2015普及组】 推销员(纪中数据-标准)

    题目 [题目描述] 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住户到入口的距离为 ...

  6. Hystrix服务容错保护

    一.什么是灾难性雪崩效应? 造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者不可用.如:硬件故障.程序BUG.缓存击穿.并发请求量过大等. 重试加大流量.如:用户重试.代码重试逻辑等. ...

  7. Codeforces 1237E. Balanced Binary Search Trees

    传送门 这一题是真的坑人,时间空间都在鼓励你用 $NTT$ 优化 $dp$...(但是我并不会 $NTT$) 看到题目然后考虑树形 $dp$ ,设 $f[i][0/1]$ 表示 $i$ 个节点的树,根 ...

  8. Codeforces 1238D. AB-string

    传送门 求合法的串看一眼很不可做 考虑一下总方案减去不合法方案 考虑如何求不合法的串,首先串中连续的相同字符一定是回文串的一部分 然后考虑 $AB$ 交错的情况,发现对于某个 $A$ 它如果左右都有 ...

  9. 牛客 109 C 操作数 (组合数学)

    给定长度为n的数组a,定义一次操作为:1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007:2. 执行a = s:现在问k次 ...

  10. javascript——== 和===的区别

    == 等于 === 全等(值和类型) console.log(5==5);//true console.log(5=="5");//true console.log(5===5); ...