for...in、for...of、forEach()有什么区别
本文原链接:https://cloud.tencent.com/developer/article/1360074
for of 和 for in 循环
循环遍历数组的时候,你还在用 for
语句走天下吗?
我曾经就是 for
走天下,最后发现自己给自己挖了一个巨大的坑,层层嵌套的循环,总要花大量的时间去捋清各种逻辑关系,很容易逻辑混乱。终于你经过千辛万苦把逻辑捋清了,实现了功能需求。可是这时候接踵而来的问题来了?性能,扩展性,重用性....等等,合着我费了九牛二虎之力白费了。这时候一把鼻涕一把泪,满是辛酸;
后来就很少很少使用 for
取而代之的是 API
和 ES6
的一些新特性
数组的 for of
一说到循环我们很容易想到 for in
,但是我们应该要知道的是 他更适合用来遍历对象而不是数组,有人说他是为遍历普通对象而设计的。
理由:
for in
遍历是随机的,数组遍历是按照一定顺序的。
for in
遍历数组索引的时候可能得到的是字符串索引而不是数字索引,而我们希望数组遍历是数字索引遍历(除了关联数组之外)
for ... in
循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array
数组实际上也是一个对象,它的每个元素的索引被视为一个属性。

循环我们也很容易想到 forEach()
方法
- Array.prototype.forEach() : 方法对数组的每个元素执行一次提供的函数。
array.forEach(callback(currentValue, index, array){
//do something
}, this)
复制代码
参数
callback
: 为数组中每个元素执行的函数,该函数接收三个参数:
currentValue
(当前值): 数组中正在处理的当前元素。
index(索引)
: 数组中正在处理的当前元素的索引。
array
: forEach()
方法正在操作的数组。
thisArg
可选:可选参数。当执行回调 函数时用作cthis
的值(参考对象)。
返回值:undefined
局限: 不能使用 break
中断循环,也不能使用 return
语句返回到外层函数

此刻我想像你推荐 for...of 循环,你的不二之选
for of
遍历数组应该是最好的选择,最简洁、最直接的遍历数组元素的语法,可以使用break
、continue
和 return
语句,同时他避开了 for in
循环的缺陷

for-of
循环不仅支持数组,还支持大多数类数组对象,for-of
循环也支持字符串遍历。
我们可以把字符串假象成数组的一种,字符串有的方法数组都有,它同样支持 Map
和 Set
对象遍历。简而言之就是有迭代器方法的都可以用for of
循环(如果你还不知道Map
和Set
我们可以开始他们的学习路程了)
再来说一说数组其他遍历的API
- Array.prototype.filter(): 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
const new_array = arr.filter(callback[, thisArg])
复制代码
callback
:用来测试数组的每个元素的函数。调用时使用参数 (element
, index
, array
)。返回 true
表示保留该元素(通过测试),false
则不保留。
thisArg
:可选。执行 callback
时的用于 this
的值。
返回值:一个新的通过测试的元素的集合的数组
- Array.prototype.map(): 创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
let new_array = arr.map(function callback(currentValue, index, array) {
// Return element for new_array
}[, thisArg])
复制代码
callback
: 生成新数组元素的函数,使用三个参数:
currentValue
: callback
的第一个参数,数组中正在处理的当前元素。
index
:callback
的第二个参数,数组中正在处理的当前元素的索引。
array
: callback
的第三个参数,map
方法被调用的数组。
ound: #eee;">thisArg
:可选的。执行 callback
函数时 使用的this
值。
- Array.prototype.every(): 如果数组中的每个元素都满足测试函数,则返回
true
,否则返回false
。 - Array.prototype.some(): 如果数组中至少有一个元素满足测试函数,则返回
true
,否则返回false
。
for...in、for...of、forEach()有什么区别的更多相关文章
- 关于js中for in和foreach in的区别
js 中for in 和foreach in的区别 两个的作用都用来遍历对象,但为什么有了for in语句了还要foreach in语句呢,后来看了下foreach in开发的文档,foreach i ...
- java 中,for、for-each、iterator 区别
java 中,for.for-each.iterator 区别: 无论是在数组中还是在集合中,for-Each加强型for循环都是它们各自的普通for循环的一种"简写方式",即两者 ...
- js之for与forEach循环的区别
回武汉打卡第四天,武汉加油,逆战必胜!今天咱们探讨一下for循环和forEach()循环的区别. 首先,for循环在最开始执行循环的时候,会建立一个循环变量i,之后每次循环都是操作这个变量,也就是说它 ...
- for循环,for…in循环,forEach循环的区别
for循环,for…in循环,forEach循环的区别for循环通关for循环,生成所有的索引下标for(var i = 0 ; i <= arr.length-1 ; i++){ 程序内容 } ...
- for, for in, for of, map, forEach 循环的区别:
for, for in, for of, map, forEach 循环的区别: for 遍历数组: //对象遍历数组 var arr = [ {Monday: '星期一', Tuesday: ' ...
- for、foreach和Iterator区别及ConcurrentModificationException异常
(问:1.for.foreach和Iterator遍历有什么区别 2.遍历删除ConcurrentModificationException异常.) 1.在形式上 for的形式是 for(int ...
- js中 forEach 和 map 区别
共同点: 1.都是循环遍历数组中的每一项. 2.forEach()和map()里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组input. 3.匿名函数中 ...
- every、some、filter、map、forEach 方法的区别总结
API功能描述: [every]:Boolean 遍历数组并执行回调,如果每个数组元素都能通过回调函数的测试则返回true,否则返回false.一旦返回false,将立即终止循环. [some]:Bo ...
- JS中some(),every(),forEach(),map(),filter()区别
JS在1.6中为Array新增了几个方法map(),filter(),some(),every(),forEach(),也就是一共有这么多方法了. 刚开始接触这些倒也记得不是很清楚,在此纪录一下以加深 ...
随机推荐
- pandas基础(2)_多重索引
1:多重索引的构造 >>> #下面显示构造pd.MultiIndex >>> df1=DataFrame(np.random.randint(0,150,size= ...
- 检查浏览器是否有此插件如flash
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- uoj#213. 【UNR #1】争夺圣杯(单调栈)
传送门 我们枚举每一个元素,用单调栈做两遍计算出它左边第一个大于它的位置\(l[i]\)和右边第一个大于它的位置\(r[i]\),那么一个区间以它为最大值就意味着这个区间的左端点在\([l[i]+1, ...
- 剑指Offer的学习笔记(C#篇)-- 二叉树的深度(详讲递归)
题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 一 . 思维发散 借助这个题目,我想用一个更好理解的方法说一说递归. ...
- JPA @MappedSuperclass注解的使用说明(转)
(2011-11-07 11:37:30) 转载▼ http://blog.sina.com.cn/s/blog_7085382f0100uk4p.html 标签: 杂谈 基于代码复用和模型分离的 ...
- vue教程5-账户登录
router export const constantRouterMap = [ { path: '/login', component: () => import('@/views/logi ...
- centOS6.5 安装后无法启动无线上网
查看无线网卡型号:[root@mookee rtl8192se_linux_2.6.0019.1207.2010]# lspci |grep Network03:00.0 Network contro ...
- setTimeout的异步传输机制
setTimeout是异步的,在设置完setTimeout后,指定代码会在设定的时间后加入到任务队列,但并不是立即执行,js是单线程语言,所有的代码按顺序执行,即同步执行,同步执行的代码放在执行队列中 ...
- replcation set (复制集)配置过程 --mongodb
一,配置规划 复制集原理(基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))如果发生主库宕机,复制集内部会进行投票选举,选择一 ...
- 如何给数组用fill函数和memset函数给数组赋初值
fill是按照单元来赋值的,所以可以填充一个区间的任意值 #include<iostream> #include<stdio.h> #include<string.h&g ...