很久之前就發(fā)現(xiàn)使用forEach循環(huán)數(shù)組時(shí)是無(wú)法跳出循環(huán)的,break和return都不生效讼撒。數(shù)組中的所有元素都會(huì)被遍歷浑厚。今天花時(shí)間研究了一下深層的原理。有不對(duì)的地方歡迎指正根盒。
1.舉個(gè)例子
var list = [0,1,2,3,4,5,6,7,8,9];
list.forEach(function(item){
console.log(item);
if (item > 3 ){
return;
}
});
輸出結(jié)果是0,1,2,3,4,5,6,7,8,9钳幅。并沒(méi)有在大于3的時(shí)候終止循環(huán)。
如果把return替換為break會(huì)報(bào)錯(cuò):Uncaught SyntaxError: Illegal break statement
2.forEach使用說(shuō)明
arr.forEach(function callback(currentValue, index, array) {
//your iterator
}[, thisArg]);
currentValue --- 當(dāng)前處理的元素
index --- 當(dāng)前處理元素的索引
array ---forEach應(yīng)用的數(shù)組
有一段提示寫到了在forEach中break和return的用法郑象。原文如下:
There is no way to stop or break a forEach()loop other than by throwing an exception. If you need such behavior, theforEach()method is the wrong tool. Use a plain loop instead. If you are testing the array elements for a predicate and need a Boolean return value, you can use
every()
or
some()
instead. If available, the new methodsfind()
orfindIndex()
can be used for early termination upon true predicates as well.
意思就是說(shuō)在forEach中使用break和return是錯(cuò)誤的贡这,如果希望使用break或者return請(qǐng)使用every或者some函數(shù)茬末。
3.為什么不能使用return和break
在V8的源碼里找了又找也沒(méi)有找到forEach函數(shù)的源碼厂榛,從其他實(shí)現(xiàn)的forEach中也能發(fā)現(xiàn)一些端倪。
Array.prototype.myEach = function(callback) {
for (var i = 0; i < this.length; i++)
callback(this[i], i, this);
};
猜測(cè)js的實(shí)現(xiàn)源碼應(yīng)該也是這種原理丽惭,我們傳入的function是這里的回調(diào)函數(shù)击奶。在回調(diào)函數(shù)里面使用break肯定是非法的,因?yàn)閎reak只能用于跳出循環(huán)责掏,而我們的回調(diào)函數(shù)不是循環(huán)體柜砾。
在回調(diào)函數(shù)中使用return,只是將結(jié)果返回到上級(jí)函數(shù)换衬,也就是這個(gè)for循環(huán)中痰驱,并沒(méi)有結(jié)束for循環(huán),所以return也是無(wú)效的瞳浦。
舉個(gè)例子實(shí)際說(shuō)明一下:
var subFunction = function(callback){
for (var i = 0;i < 10; i++){
callback(i);
console.log(i);
}
}
var func = function(i){
if(i>3){
return
}else{
console.log('callback i =' + i);
}
}
subFunction(func);
我們?cè)趂orEach中使用return就如同func中的return一樣担映,只是在回調(diào)函數(shù)中執(zhí)行了return,并不能影響到上級(jí)函數(shù)中的for循環(huán)叫潦,自然不會(huì)中斷for循環(huán)的運(yùn)行了蝇完。
4.for vs forEach
需要遍歷數(shù)組的時(shí)候使用哪個(gè)好呢?
forEach的優(yōu)點(diǎn)是寫法簡(jiǎn)單,避免了下標(biāo)溢出的情況短蜕。
for的優(yōu)點(diǎn)是性能比f(wàn)orEach好氢架,可以使用break和return。
大家根據(jù)實(shí)際情況擇優(yōu)使用吧朋魔。
如有理解不正確的地方岖研,歡迎指正~~