Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 方法链接与创建不同变量对性能的影响_Javascript - Fatal编程技术网

Javascript 方法链接与创建不同变量对性能的影响

Javascript 方法链接与创建不同变量对性能的影响,javascript,Javascript,给定一组过滤数组并减少/求和结果的操作: function arbitrary() { return [1,2,3]. filter((i)=>{return i > 1}). reduce((prev,cur)=>{return prev+cur}) } …我的假设是使用筛选器的结果创建一个临时数组,并传递一个指针/引用以减少 如果重新写入以使用临时变量: function arbitrary() { var filtered = [1,2,3].f

给定一组过滤数组并减少/求和结果的操作:

function arbitrary() {
  return [1,2,3].
    filter((i)=>{return i > 1}).
    reduce((prev,cur)=>{return prev+cur})
}
…我的假设是使用筛选器的结果创建一个临时数组,并传递一个指针/引用以减少

如果重新写入以使用临时变量:

function arbitrary() {
  var filtered = [1,2,3].filter((i)=>{return i > 1});
  return filtered.reduce((prev,cur)=>{return prev+cur});
}
…假设变量在超出范围时被垃圾收集,那么它在内存使用和性能方面是否等效


澄清一下,我理解这可以被视为微观优化,我不是在问这是否是最佳实践。我对更好地理解javascript引擎如何在内部运行很感兴趣。

这种级别的微优化很少值得修改代码。以尽可能清晰的方式编写代码。我倾向于按以下顺序考虑这些编码优先级:正确、清晰、健壮、可重用、有注释并且具有适当的性能。由于这个问题的性能增量不太可能是相关的,而且它是最后一个优先事项,那么在它之前的其他优先事项应该指导思考

如果你只是想知道内部发生了什么,你会发现可能差别很小

运行
.filter()
时,在任一代码示例中都会生成一个新数组。操作的这一部分在任何一个方面都没有区别

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

这就是说,如果中间值不需要用于其他任何事情,那么许多人会通过链接结果来推断代码更干净,因为不需要保留中间结果或分配中间结果,甚至不需要使用该变量


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

可能是等效的,但如果不是,至少它肯定是绝对不相关的。不要再为微性能操心了,它是无用的9/10
((I)=>{return I>1})
可以是
(I=>I>1)
。在那里,在传输上节省了一些字符,可能会带来更大的性能冲击…基本上没有区别:@juwiley-这个答案解决了你的问题吗?如果是这样,请勾选答案左侧的绿色复选标记以标记接受的答案,向社区表明您的问题已得到回答,然后您和提供答案的人都将获得一些声誉积分,从而在StackOverflow上获得更多特权。如果这并不能解决您的问题,请回答您还有哪些困惑。