可是使用forEach之后,代码甚至比使用它之前更加冗长。这显然是存在问题的。 对于这个问题,ES5提供了some和every方法用来处理存在提前终止的循环,它们的用法如下所示:
[1, 10, 100].some(function(x) { return x > 5; }); // true [1, 10, 100].some(function(x) { return x < 0; }); // false [1, 2, 3, 4, 5].every(function(x) { return x > 0; }); // true [1, 2, 3, 4, 5].every(function(x) { return x < 3; }); // false
这两个方法都是短路方法(Short-circuiting):只要有任何一个元素在some方法的predicate中返回true,那么some就会返回;只有有任何一个元素在every方法的predicate中返回false,那么every方法也会返回false。
因此,takeWhile就可以实现如下:
function takeWhile(a, pred) { var result = []; a.every(function(x, i) { if (!pred(x)) { return false; // break } result[i] = x; return true; // continue }); return result; }
实际上,这就是函数式编程的思想。在函数式编程中,你很少能够看见显式的for循环或者while循环。循环的细节都被很好地封装起来了。
5、总结
在使用for..in循环时,不要依赖于遍历的顺序。
当使用Object类型来保存数据时,需要保证其中的数据是无序的。
当需要表示带有顺序的集合时,使用数组类型而不是Object类型。
避免向Object.prototype中添加任何属性。
如果确实有必要向Object.prototype中添加方法属性,可以考虑使用独立函数替代。
使用Object.defineProperty来添加可以不被for..in循环遍历到的属性。
当遍历数组时,使用标准的for循环,而不要使用for..in循环。
在必要的场合考虑预先保存数组的长度,以提高性能。
使用遍历方法Array.prototype.forEach和Array.prototype.map来代替循环,从而让代码更加清晰可读。
对于重复出现的循环,可以考虑将它们进行抽象。通过第三方提供的方法或者自己实现。
显式的循环在一些场合下还是有用武之地的,相应的也可以使用some或者every方法。
以上就是本文的全部内容,希望通过这篇文章大家更加了解javascript循环的原理,大家共同进步。
您可能感兴趣的文章: