我还没有完全理解for循环和forEach方法之间的区别。何时用于循环,何时用于每个循环。forEach只适用于特定类型的对象吗?
谢谢
在大多数情况下,这取决于风格。使用for(...){...}
循环可以执行与使用forEach(...)
循环相同的操作。在本机中,javascript仅在作为Array
或Map
实例的对象上支持forEach
。
Array.forEach
让我们从Array
的forEach
开始。这个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循环。