我们什么时候使用forEach方法而不是for循环



我还没有完全理解for循环和forEach方法之间的区别。何时用于循环,何时用于每个循环。forEach只适用于特定类型的对象吗?

谢谢

在大多数情况下,这取决于风格。使用for(...){...}循环可以执行与使用forEach(...)循环相同的操作。在本机中,javascript仅在作为ArrayMap实例的对象上支持forEach

Array.forEach

让我们从ArrayforEach开始。这个forEach将回调函数作为参数。这个回调将为您调用它的数组中的每个项运行一次。回调的签名如下:

/**
* value - the current value
* index - the current index
* array - the array being iterated over (i.e. the array you called forEach on)
*/
function (value, index, array) {...}

这里有一个例子:

var sum = 0;
var nums = [1, 2, 3, 4, 5];
// This loop will sum up all the values in the 'nums' array...
nums.forEach(function (value, index, array) {
sum += value;
});
//... So will this...
sum = 0;
nums.forEach(function (value, index, array) {
sum += nums[index];
});
//... And this.
sum = 0;
nums.forEach(function (value, index, array) {
sum += array[index];
});

这将是相同的循环,但作为for循环:

var sum = 0;
var nums = [1, 2, 3, 4, 5];
for(var i = 0; i < nums.length; i++) {
sum += nums[i];
}

必须注意的是,虽然您可以提前for循环中的break,但您不能在forEach循环中执行

当涉及到for循环与forEach循环时,也存在轻微的性能差异。for循环通常更快,但对一些人来说,它们看起来很难看,很难阅读。如果你想阅读更多,可以看看David Tang的文章,文章涵盖了数组上的for循环与forEach循环

每个地图

Map上的forEach循环看起来有点不同,但想法是一样的。此回调签名为:

/**
* value - the current value
* key   - the current key
* map   - the map being traversed (i.e. the map you called forEach on)
*/
function (value, key, map) {...}

这里有一个例子:

var totalMoney = 0;
var people = new Map([['Jan', 100], ['Michael', 50], ['Dwight', 30], ['Jim', 20], ['Pam', 20]]);
// This loop will sum up all the money that 'Jan', 'Michael', 'Dwight', 'Jim', and 'Pam' possess...
people.forEach(function (value, key, map) {
totalMoney += value;
});
//... As will this...
totalMoney = 0;
people.forEach(function (value, key, map) {
totalMoney += people.get(key);
});
//... And this.
totalMoney = 0;
people.forEach(function (value, key, map) {
totalMoney += map.get(key);
});

forEach是一种更优雅的循环方法,您不需要指定数组长度和计数器。在forEach中,您可以通过item,而不是每次都编写类似arr[i]的内容。总的来说,如果您只是在数组中迭代,那么使用哪种方式并没有太大区别。

当您想在数组的所有元素上运行函数时,请使用forEach。

const numbers = [ 1, 2, 3]
const newNumbers = []
const addFive =
(number)=>newNumbers.push(number + 5)
numbers.forEach(addFive)
console.log(newNumbers)

http://jsbin.com/johenohace/edit?js

注意:除了抛出异常之外,没有任何方法可以停止或中断forEach()循环。如果您需要这样的行为,那么forEach()方法就是错误的工具。请改用纯循环。

以工作簿中的工作表为例。所有工作表都是Worksheets集合的成员。您可以使用For Each循环调用集合中的每个成员。同样,您的工作簿也是Workbooks集合的成员,该集合包含所有当前打开的工作簿。使用For Each的优点是不需要知道会有多少成员。每个集合都有一个Count属性。Worksheets.Count将告诉您ActiveWorkbook中有多少工作表,Workbooks.Count将通知您当前打开了多少工作簿。

集合的每个成员也有一个索引号。请注意,相同的数字并不一定总是标识相同的项目。在Excel中,左侧的第一个选项卡始终是Worksheets(1)。在左侧添加另一个选项卡,新选项卡将采用该数字。对于大多数集合,索引号可以替换为名称。根据标签的位置,Worksheets("Sheet1")可能与Worksheets(1)相同。

For i = 1 to Worksheets.Count
Set Ws = Worksheets(i)

将具有与For Each Ws in Worksheets相同的效果,但后者似乎更有效,而且据说在集合中循环比调用单个成员要快得多

当然,必须维护能够提高速度和更容易访问的集合。应用程序正在后台执行此操作。然而,当有添加和删除时,维护有时会落后。这导致一些专家认为For Each是不可靠的。我认为这种说法过于笼统。然而,在您依赖于从这种稳定性中获得的优势之前,最好考虑您正在访问的集合本身在代码上下文中是否稳定。

对于数组中的所有元素运行的每个都没有限制

在for循环中,如果我们想检查我们可以检查for循环的限制条件,我们必须进行限制,并且我们可以对一些范围进行限制,而不是对所有元素进行限制。

没有限制,所有元素都想做循环,我们可以使用foreach,否则我们将使用for循环。

最新更新