48

JavaScript使用类似break机制中断forEach循环

 5 years ago
source link: http://ourjs.com/detail/5bea1d28ac52fe63eba502b1?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

JavaScript数组对象,有一个forEach方法,可枚举每一个数组元素,但并不支持类似for循环的break语法,中断循环:

[1,2,3].forEach(function(item) {
    // if(!item) break; 不支持
});

解决办法,可抛出一个特殊异常,来中断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;

}

也可复写forEach方法:

// 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);

});

相关阅读:  for in 比for loop慢至少20倍


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK