【js】forEach解决return不能跳出循环

3,578 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

刷leetcode的时候遇到了这个问题,大部分的解决方案都是改用for循环,本文在他们思路上扩展一些其他的解决的方案。

原理以及为什么会出现这种问题

Array.prototype.myEach = function(callback) { 
    for (var i = 0; i < this.length; i++) 
    callback(this[i], i, this); 
 };

forEach在使用是其实是回调函数在进行真正的操作,进行数组遍历的for循环是定义在forEach里面的而我们添加的breakreturn只是写在了callback里面,和for循环并不在同一个作用域所以是不生效的。

替换

改for循环:

这里就不做赘述了

for...of遍历

ES6引入的循环方法,for...of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、Generator 对象,以及字符串。

for...of可以正确响应break、continue和return,for...of循环读取键值。循环读取键值,对应的for...in循环读取键名。

var nums = [2, 2, 2, 2, 2, 2, 9, 9, 9, 9]
var target = 9
var forof = function (nums, target) {
  for (var alue of nums) {
    if (alue == target) {
      return alue
    }
    console.log(alue)
  }
}
console.log(forof(nums, target))

2.png

可以看到for...of正确响应了return。

不替换

通过try···catch捕获异常,实现不替换forEach达到终止循环。

var nums = [2, 2, 2, 2, 2, 2, 9, 9, 9, 9]
var target = 9
var forof = function (nums, target) {
  try {
    nums.forEach((element, i) => {
      if (element == target) {
        throw new Error('0') //抛出错误
      }
      console.log(element)
    })
  } catch (e) {
    if (e.message == '0') {
      console.log(true)
    }
  }
}
console.log(forof(nums, target))

S.png

如上成功终止循环。