给定一组操作,这些操作可以过滤数组并减少/求和结果:

function arbitrary() {
  return [1,2,3].
    filter((i)=>{return i > 1}).
    reduce((prev,cur)=>{return prev+cur})
}


...我的假设是使用filter的结果创建一个临时数组,并传递一个指针/引用以进行减少。

如果将其重写为使用临时变量:

function arbitrary() {
  var filtered = [1,2,3].filter((i)=>{return i > 1});
  return filtered.reduce((prev,cur)=>{return prev+cur});
}


...假设变量超出范围,是否在内存使用和性能方面等效?

需要澄清的是,我知道这可以看作是微优化,我并不是在问这是否是最佳实践。我有兴趣更好地了解javascript引擎如何在内部运行。

最佳答案

这种微优化水平很少值得修改您的代码。以最清晰的方式编写代码。我倾向于按以下顺序考虑这些编码优先级:正确,清晰,健壮,可重用,注释且基本上具有适当的性能。由于此问题的绩效差异不太可能是相关的,它是最后一个优先事项,因此在此之前的其他优先事项应指导思想。

如果您只想知道内部发生了什么,则可能会发现差异很小。

当您运行.filter()时,任一代码示例中都会生成一个新数组。这两部分操作都没有不同。

因此,两者之间的唯一区别是在第二个代码示例中,您将其分配给了一个临时变量,然后对该临时变量调用.reduce()。第二个代码示例中没有产生新的数组,仅创建了一个附加的局部变量和一个附加的变量赋值。在函数中还要执行其他操作的一般方案中(特别是如果数组具有任何合理的大小),您将进行许多其他函数调用,因此这一额外的变量分配不太可能相关。

就是说,如果不需要其他任何中间值,那么许多人将只通过链接结果就认为代码更干净,因为不需要保留中间结果或分配中间结果,甚至不需要该变量。

综上所述,这不是普遍真理。链接并非总是更好的解决方案。有时,代码变得如此复杂,以至于将一条长长的巨型链语句分解成一些命名的中间结果,使代码更易于理解,在某些情况下,也更易于调试(因为它更容易看到中间结果)。在您的特定代码中,一些链接的操作看起来非常好,因此我个人不会使用中间变量。

10-06 15:53
查看更多