关于[JS] forEach循环return无法跳出的踩坑和解决方案

JavaScript020

关于[JS] forEach循环return无法跳出的踩坑和解决方案,第1张

在leetcode上刷题的时候踩的坑,题目是这样的

简单思考了一下,用最简单的双循环就可以解决问题,于是习惯性用forEach遍历了两次

结果发现函数返回值是undefined

百度了一下,发现是因为forEach多次执行回调函数,回调函数中使用return没法直接终止forEach,只能终止单次的回调。所以return语句在forEach内部是无法跳出循环的。

解决方案:

1.方案一:js针对数组操作的另外两个方法some()与every()

2.方案二:for/while语句老实循环

总结原因还是对forEach方法理解不够到位

第一种:普通for循环

for(j = 0 j < arr.length j++) {

   

}

第二种:优化版for循环

for(j = 0,len=arr.length j < len j++) {

   

}

第三种:弱化版for循环

for(j = 0 arr[j]!=null j++) {

   

}

第四种:foreach循环

arr.forEach(function(e){  

   

})

第五种:foreach变种

Array.prototype.forEach.call(arr,function(el){  

   

})

第六种:for in循环

for(j in arr) {

   

}

第七种:map遍历

arr.map(function(n){  

   

})

第八种:forof遍历(需要ES6支持)

for(let value of arr) {  

   

})

JS的 for 循环主要包含如下几种: for(let i = 0i <leni++) , for-in , for-of , for-each 。

至于第一种 for 循环,地球人都会,按下不表。难点在于 for-in , for-of , for-each 直接有什么区别,看起来都差不多的样子。

一句话概述 for-in 与 for-of : for-in 遍历得到的是 key 值,适用于对象的遍历, for-of 得到的是 value 值,适合数组的遍历。只要有 iterator 接口的数据结构,都可以使用 for-of 循环,包括: Array, Map, Set, String, arguments对象, Nodelist对象

获得的是属性值

获得的是对象的索引值

遍历的时候不要用这个!

当给数组的原型添加属性时,for in 会遍历到原型链上的属性

这时候只要判断是不是本身所有的属性就行了

传入匿名的回调函数,匿名函数的参数为:当前项item,索引index(可省),当前数组array(可省)

for-of这个方法避开了for-in循环的所有缺陷

与forEach()不同的是,它可以正确响应break、continue和return语句

map遍历与foreach类似,支持使用return语句,支持return返回值

参考链接 link