百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> 怎样中止forEach轮回(具体介绍)
分享文章到:

怎样中止forEach轮回(具体介绍)

发布时间:09/01 来源:未知 浏览: 关键词:
本篇文章给大家带来的内容是关于怎样中止forEach轮回(具体介绍),有必然的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

在使用for轮回的时候可以使用break 或者return语句来完毕for轮回(return直接完毕函数),但是假如使用forEach轮回怎样跳出轮回呢?

尝试使用break 和return

第一尝试一使用return语句----木有结果

[1,2,3,4,5].forEach(item=>{
    if(item===2){
    return
    }
    console.log(item);
})

MDN给出的官方说明

为什么会显现这样的状况?先看一下官方文档的说明。
MDN文档上明白说明forEach轮回是不成以退出的。

引自MDN
There is no way to stop or break a forEach() loop other than by throwing an exception. If you need such behavior, the forEach() method is the wrong tool.
留意: 没有方法中止或者跳出 forEach() 轮回,除了抛出一个非常。假如你需要这样,使用 forEach() 办法是错误的。
若你需要提早终止轮回,你可以使用:
简便轮回
for...of 轮回
Array.prototype.every()
Array.prototype.some()
Array.prototype.find()
Array.prototype.findIndex()

探讨为什么break和return不可

先看看为什么return没有结果,break报错,forEach的实现方式用代码表示出来可以写成如下的构造

const arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
  const rs = (function(item) {
    console.log(item);
    if (item > 2) return false;
  })(arr[i])
}

使用return语句相当于在每个自施行函数中将返回值复制给rs,但是实际对整个函数并没有影响。而使用break语句报错是由于再JS的说明器中break语句是不成以显现在函数体内的。

怎样变通跳出forEach轮回

MDN官方引荐的办法

// every在碰到return false的时候,中止轮回。some在碰到return ture的时候,中止轮回。
var a = [1, 2, 3, 4, 5]
a.every(item=>{
    console.log(item); //输出:1,2
    if (item === 2) {
        return false
    } else {
        return true
    }
})
var a = [1, 2, 3, 4, 5]
a.some(item=> {
    console.log(item); //输出:1,2
    if (item === 2) {
        return true
    } else {
        return false
    }
})

其他办法

1.使用for轮回或者for in 轮回代替

2.使用throw抛出非常

try {
  [1, 2, 3, 4, 5].forEach(function(item) {
    if (item=== 2) throw item;
    console.log(item);
  });
} catch (e) {}

3.使用推断跑空轮回

var tag;
[1, 2, 3, 4, 5].forEach(function(item){
    if(!tag){
        console.log(item);
        if(item===2){
            tag=true;
        }
    }

这样做有两个问题,第一个问题,全局增添了一个tag变量,第二个问题,外表上看是终止了forEach轮回,但是实际上轮回的次数并没有改动,只是在不知足前提的时候callback什么都没施行罢了,先来解决第一个问题,怎样删除全局下新增的tag变量 。实际上forEach还有第二个参数,表示callback的施行上下文,也就是在callback里面this对应的值。因此我们可以讲上下文设定成空对象,这个对象天然没有tag属性,因此拜访this.tag的时候会得到undefined

[1, 2, 3, 4, 5].forEach(function(item){
    if(!this.tag){
        console.log(item);
        if(item===2){
            this.tag=true;
        }
    }
},{})

4.修改索引

var array=[1, 2, 3, 4, 5]
array.forEach(item=>{
  if (item == 2) {
    array = array.splice(0);
  }
  console.log(item);
})

讲解:

forEach的施行细节

1.遍历的范畴在第一次施行callback的时候就已经肯定,所以在施行历程中去push内容,并不会影响遍历的次数,这和for轮回有很大不同,下面的两个案例一个会造成死轮回一个不会

var arr=[1,2,3,4,5]
//会造成死轮回的代码
for(var i=0;i<arr.length;i++){
    arr.push('a')
}
//不会造成死轮回
arr.forEach(item=>arr.push('a'))

2.假如已经存在的值被改动,则传递给 callback 的值是 forEach 遍历到他们那一刻的值。

var arr=[1,2,3,4,5];
arr.forEach((item,index)=>{
    console.log(`time ${index}`)
    arr[index+1]=`${index}a`;
    console.log(item)
})

3.已删除的项不会被遍历到。假如已拜访的元素在迭代时被删除了(例如使用 shift()),之后的元素将被跳过。

var arr=[1,2,3,4,5];
arr.forEach((item,index)=>{
    console.log(item)
    if(item===2){
        arr.length=index;
    }
})

在知足前提的时候将后面的值截掉,下次轮回的时候照不到对应的值,轮回就完毕了,但是这样操纵会毁坏原始的数据,因此我们可以使用一个小技巧,马上数组从0开端截断,然后从新赋值给数组也就是array=array.splice(0)。

本篇文章到这里就已经全部完毕了,更多其他出色内容可以关注PHP中文网的JavaScript教程视频栏目!

以上就是怎样中止forEach轮回(具体介绍)的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板