考虑这段JavaScript代码:
cont groups = [{ name: 'Sean', type: 'A' },
{ name: 'Jen', type: 'A' },
{ name: 'Tom', type: 'B'}]
for(const group of groups.filter(g => g.type === 'A')) {
...do some work
}
for循环会在每次迭代时重新评估组过滤器吗?如何去测试呢?在此示例中,这没什么大不了,但是,在大型集合上,重要的是取而代之的是将filter操作提升到其自己的变量中。
答案 0 :(得分:1)
否,它不会在每次迭代时重新评估,而是在开始时进行。 For ... of循环与迭代器对象一起使用,该迭代器对象在内部对所有元素索引进行计数。对于每次迭代,它调用迭代器的next()方法来获取下一个元素。 有关迭代器的更多信息,请参阅此link
答案 1 :(得分:0)
基于Pointy在其评论中的建议,我将console.log
放到了过滤器回调中。在下面的示例中,我将其更进一步,并使用了一些count变量以确保其不会在每次迭代过程中重新评估filter函数。如果是的话,我期望值是6(数组中的3个项乘以2个匹配的元素)
const groups = [{ name: 'Sean', type: 'A' },
{ name: 'Jen', type: 'A' },
{ name: 'Tom', type: 'B'}]
let cnt = 0
for(const group of groups.filter(g => {
console.log("I am here")
cnt += 1
return g.type === 'A'
})) {
document.getElementById("count1").value = cnt
}
cnt = 0
const filteredGroup = groups.filter(g => {
console.log("I am here")
cnt += 1
return g.type === 'A'
})
for(const group of filteredGroup) {
document.getElementById("count2").value = cnt
}
<div>
<label>Filter inline with for loop</label>
<input type="text" id="count1" />
<br />
<br />
<label>Filter set outside of loop</label>
<input type="text" id="count2" />
<br />
</div>
这似乎证实了一些评论和RK_15的答案,即它没有重新评估for
循环内的过滤器。