跟我学习javascript的循环(3)

可是使用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循环的原理,大家共同进步。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgzjpz.html