你不知道的JS循环中断

简介: 你知道 JS 中断循环有哪些吗?

你知道 JS 中断循环有哪些吗?除了 for 循环的 break,还有哪些可以中断循环?接下来笔者以实际业务例子,分享几种能中断循环的方案


forEach


在实际业务中你可能会写以下的业务代码,举个栗子,在一个循环表单域中,你需要内容为空,就禁止提交

js
const shopList = [{title: 'Apple', price: 10}, {title: 'banana', price: ''},{title: 'orange', price: 5}]

以上是一组数组源,于是你的思路可能会这样

// 1.js
const hasPriceEmpty = (arr) => {
   bool = false; // 默认都不是空
  arr.forEach(v => {
      if (v.price === '') {
        bool = true;
        break;
      }
      console.log(v);
  });
  return bool;
};
const handleSubmit = () => {
    if (hasPriceEmpty(shopList)) {
      return;
    }
    // 下面的继续业务操作
    console.log('go on...');
}
handleSubmit();

运行测试命令node 1.js,报错了!

image.png

于是你把break改成return

76a30c14bc36abdcab603697e2b3a603.png

你会发现并没有打印go on...,确实是hasPriceEmpty这个方法已经达到了自己的业务要求,但是打印出了第一组和第三组数据。


于是mdn上关于 forEach 有这么一段话,Note: 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.


大概意思就是除了抛出异常,break 无法中断循环,如果你想有中断行为,forEach不是一个好办法。


于是你想中断循环,你改了下代码

 ...
const hasPriceEmpty = (arr) => {
    bool = false; // 默认都不是空
    arr.forEach(v => {
        if (v.price === '') {
            bool = true;
            throw new Error('给我中断循环吧')
        }
         try {
            console.log(v)
        } catch(e) {
          console.log(e);
          console.log(v)
         }
    });
    return bool;
};

对不起,页面只打印了第一组数据,且页面抛出了异常

77e6dd96bd1e816b4edd3b7ab71ed35b.png

我确实做到了中断forEach循环异常了,但是这个错误作为一个强迫症患者,我是不能接受的(throw抛出的异常,记得try catch中捕获)。


for循环break中断


这是笔者认为大部分人都能想到的办法

const shopList = [{ title: 'Apple', price: 10 }, { title: 'banana', price: '' }, { title: 'orange', price: 5 }];
const hasPriceEmpty = (arr) => {
    let bool = false; // 默认都不是空
    for (let i = 0, len = arr.length; i < len; i++) {
        if (arr[i].price === '') {
            bool = true;
            break;
        }
        console.log(arr[i]);
    }
    return bool;
};
const handleSubmit = () => {
    if (hasPriceEmpty(shopList)) {
        return;
    }
    // 下面的继续业务操作
    console.log('go on...');
}
handleSubmit();

结果很令人欢喜,完美

a3c98d00bdf1b907f116ec1661fcc80e.png

通常这种方式用得最多,但是作为老司机,你还需要掌握多一点其他方法。于是中断循环还有...


while 循环中断


...
const hasPriceEmpty = (arr) => {
    let bool = false; // 默认都不是空
    let index = 0
    while (index < arr.length) {
        index++;
        console.log(arr[index], '000');
        if (arr[index].price === '') {
            bool = true;
            break
        }
        console.log(arr[index], '111');
    }
    return bool;
};
...

结果喜大普奔,依然可以,测试结果如下

10301f030512b80eee118968d9b0a919.png

这已经达到我们想要的效果了。


利用iterable迭代器,for...of 中断循环


这里iterable是指具有该特性的迭代器,比如ArrayMapSet


Array


...
const hasPriceEmpty = (arr) => {
    let bool = false; // 默认都不是空
    for (let item of arr) {
        if (item.price === '') {
            bool = true;
            break;
        }
        console.log(item, '111');
    }
    return bool;
};
...

于是测试结果依旧ok

5b1589a9e253f6d57ff52b62d38e87ae.png

为什么数组可以用for..of循环,你可以在控制台打印注意到

19cce90d518fa8522dda9d7f0a574b92.png

原来默认申明的[]原型链上有一个这样的iterator的迭代器,所以你可以利用iterator的特性,用for...of中断循环


Map


...
const hasPriceEmpty = (arr) => {
    let bool = false; // 默认都不是空
    const map = new Map();
    // 将数据设置到Map中
    arr.forEach(item => {
        map.set(item.title, item);
    })
    for (let s of map) {
        console.log(s, '000')
        if (s[1].price === '') {
            bool = true;
            break;
        }
        console.log(s, '111');
    }
    return bool;
};
...

结果如下

5851618b03240a5b8c0ab32a6fb13ff4.png

以上代码也等价于

const sourceData = [{ title: 'Apple', price: 10 }, { title: 'banana', price: '' }, { title: 'orange', price: 5 }];
const shopList = new Map([sourceData]);
const hasPriceEmpty = (arr) => {
    let bool = false; // 默认都不是空
    for (let s of arr) {
        console.log(s, '000')
        if (s[1].price === '') {
            bool = true;
            break;
        }
        console.log(s, '111');
    }
    return bool;
};
const handleSubmit = () => {
    if (hasPriceEmpty(shopList)) {
        return;
    }
    // 下面的继续业务操作
    console.log('go on...');
}
handleSubmit();

验证结果如下:

fcc872b9425fbd57bacb54d8f481aa6f.png

利用Mapiterable的可迭代性,通过for...of中断循环,具体可以在控制台下验证

image.png


Set



同样是一个栗子举证

const shopList = [{ title: 'Apple', price: 10 }, { title: 'banana', price: '' }, { title: 'orange', price: 5 }];
const hasPriceEmpty = (arr) => {
    let bool = false; // 默认都不是空
    const setArr = new Set([...shopList]);
    for (let s of setArr) {
        console.log(s, '000')
        if (s.price === '') {
            bool = true;
            break;
        }
        console.log(s, '111');
    }
    return bool;
};
const handleSubmit = () => {
    if (hasPriceEmpty(shopList)) {
        return;
    }
    // 下面的继续业务操作
    console.log('go on...');
}
handleSubmit();

输出验证结果:

image.png

SetMap一样,可以在控制台验证一下iterable属性


总结


  1. forEach的中断循环可以抛异常来达到目的,但是不适合此业务场景
  2. for 循环通用大法,break可以终止循环
  3. while循环,break也可以终止循环
  4. iterable特征的可迭代器,for...ofbreak中断循环,并且最重要的一点是在break后,当前索引条件不会继续执行,也就是for...of中,执行break后,后面语句都不会执行。
相关文章
|
2月前
|
JavaScript 前端开发
JS循环for、for...of、for...in
本文介绍了JavaScript中不同的循环语句,包括传统的`for`循环、`for...of`循环用于遍历数组和类数组对象、`for...in`循环用于遍历对象的属性,并通过示例代码展示了它们的用法和区别。
45 6
JS循环for、for...of、for...in
|
2月前
|
JavaScript 前端开发
JavaScript基础知识-流程控制之while循环
这篇文章介绍了JavaScript中的while循环和do...while循环的基础知识,并通过一个实际案例演示了如何使用while循环计算投资增长到特定金额所需的年数。
53 2
JavaScript基础知识-流程控制之while循环
|
1月前
|
JavaScript 前端开发
js循环有几种
js循环有几种
32 0
|
3月前
|
JavaScript 前端开发
JavaScript中有哪几种循环?他们的运用场景在哪?
JavaScript中有哪几种循环?他们的运用场景在哪?
|
3月前
|
JavaScript 前端开发 索引
js的循环中foreach、for in和for of的区别
js的循环中foreach、for in和for of的区别
154 0
|
18天前
|
JavaScript
js动画循环播放特效源码(上班族的一天)
js动画循环播放特效是一段实现了包含形象的卡通小人吃、睡、电脑工作的网页动画,js循环动画,简单的画面设计。非常丝滑有意思,欢迎对此代码感兴趣的朋友前来下载参考。
27 2
|
2月前
|
前端开发 JavaScript
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
本文介绍了JavaScript中的循环语句,包括for循环、for-in循环、for-of循环、while循环、do-while循环以及break和continue的使用。
57 1
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
|
2月前
|
JavaScript 前端开发
JavaScript基础知识-forEach循环
关于JavaScript基础知识中forEach循环的介绍。
45 1
JavaScript基础知识-forEach循环
|
2月前
|
JavaScript 前端开发 索引
|
1月前
|
JavaScript
自动循环提交js
自动循环提交js
17 0