我试图完成这个Codewars挑战,该问题涉及查找一个数字的约数,然后计算这些约数平方的和。我对此问题有两种方法。
第一种方法基于另一个关于查找所有约数之和的Stackoverflow问题,并且一开始看起来非常聪明:
function divisorsSquared(n) {
// create a numeric sequence and then reduce it
return [...Array(n+1).keys()].slice(1)
.reduce((sum, num)=>sum+(!(n % (num)) && Math.pow(num,2)), 0);
}
我使用的第二种方法是使用简单的for循环:
function divisorsSquared(n) {
var sum = 0;
for(var i = 1; i<= n; i++){
if(n % i === 0) sum += Math.pow(i,2);
}
return sum;
}
现在我注意到第一种方法比第二种方法慢得多,一个快速的jsperf测试证实了这一点。
我的问题是:为什么第一种方法要慢得多,哪种方法在生产代码中更优?
在Codewars上,我注意到对于许多挑战,有聪明的单行解决方案使用类似的数组方法。作为初学者,即使性能更差,这样的解决方案是否可以认为是更好的实践而不是for循环?