forEach

  数组实例的遍历方法

const arr=['red', 'green', 'blue'];
arr.forEach(function(element, index) {console.log(element);// red green blueconsole.log(index);// 0 1 2
});

  forEach这种写法的问题是,无法中途跳出forEach循环,break命令或return命令都不能奏效。

for...in

  JavaScript原有的循环,只能获得对象的键名,不能直接获取键值。

var arr = ['a', 'b', 'c', 'd', 'e'];
for(let i in arr) {console.log(i);//0 1 2 3 4
}for(let index in arr) {    console.log(arr[index]);// a b c d e}

let es6 = {edition: 6,committee: "TC-39",standard: "ECMA-262"
};
for(let e in es6) {console.log(e);
}
//edition
//committee
//standard

  for...in循环有几个缺点:

    数组键名是数字,但是for...in循环是以字符串作为键名"0","1","2"等

    for...in循环不仅遍历数字键名,还会遍历手动添加的其它键,甚至包括原型链上的键。

    某些情况下,for...in循环会以任意顺序遍历键名。

  总之,for...in循环主要是为遍历对象为设计的,不适用于遍历数组。

for...of

  ES6借鉴C++、Java、C#和Python语言,引入了for...of循环,作为遍历所有数据结构的统一的方法。一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以用for...of循环遍历它的成员。也就是说,for...of循环内部调用的是数据结构的Symbol.iterator方法。for...of循环可以使用的范围包括数组、Set和Map结构、某些类似数组的对象(比如arguments对象、DOM NodeList对象)、Generator对象以及字符串。

  数组原生具有iterator接口(即默认部署了Symbol.iterator属性),for...of循环本质上就是调用这个接口产生的遍历器,允许遍历获得键值

var arr = ['a', 'b', 'c', 'd', 'e'];
for(let i of arr) {console.log(i);//a b c d e
}

  for...of循环可以代替数组实例的forEach方法

  for...of循环调用遍历器接口,数组的遍历器接口只返回具有数字索引的属性;这一点与for...in也不一样。

let arr = [1,3,5];
arr.foo = 'hello';
for(let i in arr) {console.log(i);//'1', '3', '5', 'foo'
}for(let i of arr) {console.log(i);//'1', '3', '5'
}

  Set和Map结构也原生具有Iterator接口,可以直接使用for...of循环

var engines = new Set(["Gecko", "Trident", "Webkit", "Webkit"]);
for(var e of engines) {console.log(e);
}
//Gecko
//Trident
//Webkit
var es6 = new Map();
es6.set("edition", 6);
es6.set("committee", "TC39");
es6.set("standard", "ECMA-262");
for(var [name, value] of es6) {console.log(name+ ":" + value);
}
//edition: 6
//committee: TC39
//standard: ECMA-262

  Set和Map遍历的顺序是按照各个成员被添加进数据结构的先后顺序。其次,Set结构遍历,返回的是一个值。Map结构遍历返回的是一个数组,该数组的两个成员分别为当前Map成员的键名和键值。

  for...of循环,获得数组的索引,可以借助数组实例的entries方法和keys方法。

let arr = ["a", "b", "c"];
for(let pair of arr.entries()) {console.log(pair);
}
//[0, 'a']
//[1, 'b']
//[2, 'c']

  for...of遍历类似数组的对象(String、DOM NodeList、arguments)

//字符串
let str="hello";
for(let s of str) {console.log(s);// h e l l o
}
//DOM NodeList对象
let paras = document.querySelectorAll("p");
for(let p of paras) {p.classList.add("test");
}
//arguments对象
function printArgs() {for(let x of arguments) {console.log(x);}
}
printArgs('a', 'b');
//'a'
//'b'

  对字符串来说,for...of循环还能够正确识别32位UTF-16字符

for (let x of 'a\uD83D\uDC0A) {console.log(x);
}
//'a'
//'\uD83D\uDC0A'

  并不是所有类似数组的对象都具有Iterator接口,一个方法是用Array.from方法将其转换为数组

let  arrayLike = [length: 2, 0: 'a', 1: 'b'];
for(let x of array.from(arrayLike)) {console.log(x);
}

  对于普通的对象,for...of结构不能直接使用,必须部署Iterator接口后才能使用。一种解决方法是将对象的键名生成一个数组,然后遍历这个数组:

for(let key of Object.keys(someObject)) {console.log(key + ":" + someObject[key]);
}

  另一个方法是使用Generator函数

function* entries(obj) {for(let key of Object.keys(obj)) {yield [key, obj[key]];}
}
for(let [key, value] of entries(obj)) {console.log(key, '->', value);
}
//a -> 1
//b -> 2
//c -> 3

  for...of相对其它遍历方法,有以下优点:

    有着同for...in一样简洁的语法,但是没有for...in那些缺点;

    不同于forEach方法,它可以与break、continue和return配合使用

    提供了遍历所有数据结构的统一操作接口

for(var n of fibonacci) {if(n>1000)break;console.log(n);
}

参考:

Iterator和for...of

转载于:https://www.cnblogs.com/princess-knight/p/9326458.html

forEach、for...in、for...of相关推荐

  1. JavaScript中 for、for in、for of、forEach等使用总结

    在JavaScript中,我们经常需要去循环迭代方法操作数组对象等,常见等循环方法有 for.for in.for of.forEach等. 1.for循环 for循环是最基础常见的一种循环,圆括号中 ...

  2. Java的知识点16——数组概述和特点、数组声明、初始化、数组的遍历、for-each循环、数组的拷贝

    数组的定义 数组是相同数据类型的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们.数组的三个基本特点 ...

  3. Java基础【之】循环、流程控制 (if else、whitch case、while、do while、for...i、foreach、多层循环与退出)

    Java基础[之]循环.流程控制 (if else.whitch case.while.do while.for...i.foreach.多层循环与退出) 1.默认顺序执行 2.分支控制 if els ...

  4. JavaScript中for、for...in、for...of、forEach的区别和用法

    JavaScript中for.for...in.for...of.forEach的区别和用法 for循环 forEach循环 for...in循环 for...of循环 总结 for循环 基本语法格式 ...

  5. 11-stream流-流水线编码、filter等中间方法、forEach等终止方法、collect获取返回结果方法、lambda练习

    文章目录 1.体验Stream流[理解] 2.Stream流的常见生成方式[应用] 代码1:单列集合流 代码2:双列集合流 代码3:数组->流 代码4:同种数据类型的多个数据 Stream流的获 ...

  6. JavaScript for、for..in、for..of、forEach的区别

    JS中循环语句众多,你是否也有用的时候突然不知道如何选择经历,今天就代码君就来总结一下. for 我很"low"但也很强大 for是最基础的循环语句,语法想必不用多说.for只管循 ...

  7. for in、for of、forEach、Object.keys(obj)、Object.getOwnPropertyNames(obj)的区别、优缺点和使用场景

    先做一个测试题: const arr = [1, 2, 3] arr.name = 'name' // 不要这么做,只是为了测试 Array.prototype.test = function () ...

  8. forEach、map、for..of、for..in、for循环实现异步变同步的问题

    一.背景 开发中经常遇到,遍历去查询服务获取数据,并且后边的代码需要借用上边查询到的数据,但是查询服务是一个异步操作,运用forEach或者map循环,在还没有查询到数据后,就执行了下一步操作,所以以 ...

  9. 阿里面试: 说说强引用、软引用、弱引用、虚引用吧

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 我们都知道 JVM 垃圾回收中,GC判断堆中的对象实例或数 ...

最新文章

  1. 【ACM】杭电OJ 1003。
  2. 常见加密算法分类,用途,原理以及比较
  3. rancher使用fluentd-pilot收集日志分享
  4. 如何用web3.js在以太坊区块链上保存数据?
  5. zabbixdocker里的mysql_docker zabbix安装部署(数据库和web及zabbix服务都用docker版)
  6. columns列:Rows 工作表上所有的行
  7. VMware windows server 2008配置dns服务
  8. js修改css样式的方法,js如何设置css样式?js修改css样式的方法
  9. MFC-利用内存映射文件来读写文件
  10. 语音信号处理基础知识之频谱、相位谱、幅度谱、功率谱及语谱图
  11. Premiere银色金属玻璃质感logo标志片头AE模板mogrt
  12. 扬帆际海:shopee跨境电商客服回复流程
  13. FCRD-P帆软考试总结
  14. VR游戏开发干货教程:如何创建一个VR项目
  15. [附源码]java毕业设计咖啡销售管理系统-
  16. C/C++ __builtin 超实用位运算函数总结
  17. 数学建模不会 LaTex 排版 | 教你如何在 Word 中优雅地使用漂亮的 LaTex 公式
  18. [Swift A] - 实战-豆瓣电台总结
  19. linux查找命令which、whereis、find比较解析
  20. weblogic反序列化介绍及环境搭建

热门文章

  1. java调用自身_Java有趣的自己调用自己
  2. linux时间调整为dst,禁用Linux中的夏令时(DST)更改
  3. axure中怎么把图片变圆_怎么将图片中的文字提取出来?收下这份识别教程
  4. java随机抽题系统_2020税务师机考模拟系统全新上线,智能题库 随机组卷,快来试手...
  5. Oracle11g创建表空间、创建用户、角色授权、导入导出表以及中文字符乱码问题
  6. 彻底搞懂Scrapy的中间件(二)
  7. 010. 深入JVM学习—垃圾收集策略概览
  8. inotify实时同步工具理论和实战
  9. 《正则表达式经典实例(第2版)》——2.18 向正则表达式中添加注释
  10. JAVA生成条码(jbarcode)