JavaScript中如何中断forEach循环

先来看下forEach的实现

// Production steps of ECMA-262, Edition 5, 15.4.4.18// Reference: http://es5.github.io/#x15.4.4.18if (!Array.prototype.forEach) {

  Array.prototype.forEach = function(callback, thisArg) {

    var T, k;

    if (this === null) {      throw new TypeError(‘ this is null or not defined‘);    }

    // 1. Let O be the result of calling toObject() passing the    // |this| value as the argument.    var O = Object(this);

    // 2. Let lenValue be the result of calling the Get() internal    // method of O with the argument "length".    // 3. Let len be toUint32(lenValue).    var len = O.length >>> 0;

    // 4. If isCallable(callback) is false, throw a TypeError exception.     // See: http://es5.github.com/#x9.11    if (typeof callback !== "function") {      throw new TypeError(callback + ‘ is not a function‘);    }

    // 5. If thisArg was supplied, let T be thisArg; else let    // T be undefined.    if (arguments.length > 1) {      T = thisArg;    }

    // 6. Let k be 0    k = 0;

    // 7. Repeat, while k < len    while (k < len) {

      var kValue;

      // a. Let Pk be ToString(k).      //    This is implicit for LHS operands of the in operator      // b. Let kPresent be the result of calling the HasProperty      //    internal method of O with argument Pk.      //    This step can be combined with c      // c. If kPresent is true, then      if (k in O) {

        // i. Let kValue be the result of calling the Get internal        // method of O with argument Pk.        kValue = O[k];

        // ii. Call the Call internal method of callback with T as        // the this value and argument list containing kValue, k, and O.        callback.call(T, kValue, k, O);      }      // d. Increase k by 1.      k++;    }    // 8. return undefined  };}

基本用法:

arr.forEach(callback[, thisArg]),callback会接收到三个参数:currentValue、index、array

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.forEach(function(value, index, _ary) {    console.log(index + ": " + value);    return false;});

// logs:

0: JavaScript

1: Java

2: CoffeeScript

3: TypeScript

 

使用some函数

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.some(function (value, index, _ary) {    console.log(index + ": " + value);    return value === "CoffeeScript";});

// logs:

0: JavaScript

1: Java

2: CoffeeScript

 

使用every函数

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.every(function(value, index, _ary) {    console.log(index + ": " + value);    return value.indexOf("Script") > -1;});

// logs:

0: JavaScript

1: Java

使用fo..of

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];for (let el of arr) {  console.log(el);  if (el === 5) {    break;  }}

// logs:

0

1

2

3

4

5

 

而如果forEach想实现类似every、some函数的效果该如何做呢?

在stackoverflow上得票比较高的有如下几类方法 :

1、循环外使用try.. catch,当需要中断时throw 一个异常,然后catch进行捕获;

2、重写forEach(也是借鉴第一种方法);

var BreakException = {};

try {  [1, 2, 3].forEach(function(el) {    console.log(el);    if (el === 2) throw BreakException;  });} catch (e) {  if (e !== BreakException) throw e;}

 

// Use a closure to prevent the global namespace from be polluted.(function() {  // Define StopIteration as part of the global scope if it  // isn‘t already defined.  if(typeof StopIteration == "undefined") {    StopIteration = new Error("StopIteration");  }

  // The original version of Array.prototype.forEach.  var oldForEach = Array.prototype.forEach;

  // If forEach actually exists, define forEach so you can  // break out of it by throwing StopIteration.  Allow  // other errors will be thrown as normal.  if(oldForEach) {    Array.prototype.forEach = function() {      try {        oldForEach.apply(this, [].slice.call(arguments, 0));      }      catch(e) {        if(e !== StopIteration) {          throw e;        }      }    };  }})();    // Show the contents until you get to "2".[0,1,2,3,4].forEach(function(val) {  if(val == 2)    throw StopIteration;  alert(val);});

 

参考链接:

http://dean.edwards.name/weblog/2006/07/enum/

http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of

时间: 2024-12-24 20:13:42

JavaScript中如何中断forEach循环的相关文章

JavaScript 中的12种循环遍历方法

题目:请介绍 JavaScript 中有哪些循环和遍历的方法,说说它们的应用场景和优缺点? 1.for 循环 let arr = [1,2,3];for (let i=0; i<arr.length; i++){ console.log(i,arr[i])}// 0 1// 1 2// 2 3 for 循环是 Js 中最常用的一个循环工具,经常用于数组的循环遍历. 2.for in 循环 let obj = {name:'zhou',age:'**'}for(let i in obj){ con

javascript中的for in循环和for循环的使用

javascript for...in 语句 for...in 语句用于对数组或者对象的属性进行循环操作. for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作. Tip:for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”. 语法: for (变量 in 对象) { 在此执行代码 } “变量”用来指定变量,指定的变量可以是数组元素,也可以是对象的属性. 实例:使用 for ... in 循环遍历数组. <html> <

js(javascript)中的奇特for循环写法!

本文章为JavaScript强化教程系列介绍js开发 最近在在一份面试题中看到这样几种for循环的写法第一反应是懵逼的 之后仔细看一下还是没有问题的 首先上代码第一种 正常的循环 [javascript] view plain copy  forvar i=0;i<10;i++{} 这种f循环是正常的循环完全没有问题 第二种 [javascript] view plain copy  forvar i=10;i--;{} 循环结果是正常循环10次 第三种 for(;;); 这种会死循环 第四种

JavaScript中Map和ForEach的区别

译者按: 惯用Haskell的我更爱map. 原文: JavaScript?-?Map vs. ForEach - What's the difference between Map and ForEach in JavaScript? 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 如果你已经有使用JavaScript的经验,你可能已经知道这两个看似相同的方法:Array.prototype.map()和Array.prototyp

javascript中的map, forEach

.map(fn)方法 1 var a=[2, 4, 6]; 2 a.map(function(d, i, arr){ 3 return {x:i, y:d*i, z:arr}; 4 }); 输出结果: 1 [{x:0, y:0, z:[2, 4, 6]}, 2 {x:1, y:4, z:[2, 4, 6]}, 3 {x:2, y:12, z:[2, 4, 6]}] 回调函数中传入的d是遍历数组的值, i是数组的索引, 整个数组也在第三个参数传进来 map会将原数组投射到一个长度一样的新数组中,新

如何快速理解JavaScript 中重要语句for循环

一.基本结构:for(起始状态:判断条件:状态改变){ 执行语句: } 执行顺序:for(var i=1;i<3;i++){ alert(i); } 1.判断条件    2.执行语句    3.状态改变 break(结束此循环).continue(跳过本次循环,开始下个循环) 二.例: 1.输出100 以内与7相关的数 <script type="text/javascript"> var str = ''; for(var i = 1; i <= 100; i

javascript中的for&hellip;&hellip;in循环

  <script type="text/javascript">    var theBeatles=new Array("John","Paul","Gearge","Ringo");    for(var loopCounter=0;loopCounter<theBeatles.length;loopCounter++){        document.write(theBeatl

好文:javascript中的四种循环

https://juejin.im/entry/5a1654e951882554b8373622?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com

Javascript中的循环变量声明,到底应该放在哪儿?

不放走任何一个细节.相信很多Javascript开发者都在声明循环变量时犹豫过var i到底应该放在哪里:放在不同的位置会对程序的运行产生怎样的影响?哪一种方式符合Javascript的语言规范?哪一种方式和ecma标准未来的发展方向匹配?本文将对四种常见的声明循环变量的书写方式进行简单的分析和比较. 习惯1:不声明直接使用 function loop(arr) { for (i = 0; i < arr.length; i++) { // do something } } 非常危险的使用习惯,