【发布时间】:2016-02-17 03:48:23
【问题描述】:
我正在阅读《Javascript 中的函数式编程》一书。
在第 2 章中,对于查找字符串中仅包含字母的前四个单词的命令式/函数式代码进行了以下比较:
命令式
var words = [], count = 0;
text = myString.split(' ');
for (i=0; count<4, i<text.length; i++) {
if (!text[i].match(/[0-9]/)) {
words = words.concat(text[i]);
count++;
}
}
功能性
var words = [];
var words = myString.split(' ').filter(function(x){
return (! x.match(/[1-9]+/));
}).slice(0,4);
我推断,对于任何text 的长度大于四个的情况,命令式 版本会更快,因为它只会找到符合条件的前四个单词,而 functional 版本首先过滤整个数组,然后才分割前四个元素。
我的问题是,我的假设是否正确?
【问题讨论】:
-
这是一个非常棒的问题。我的暂定答案是“这取决于编译器/语言。”我知道 Haskell 做了一些疯狂的优化,因为它可以对很多行为做出完美的保证。对于 Javascript,情况并非如此。
-
查看惰性求值。
-
不管它是否正确,请注意效率并不是函数式编程的重点。还有其他更重要的功能,而且您通常甚至愿意用它们换取执行速度。
-
这个问题(或者至少你的推理)并不是关于函数与命令式编程的。这是关于您为两者选择的解决方案。您可以采用一种功能性方法,在找到前 4 个项目后也会停止。
-
此外,“功能”示例虽然非常易读和清晰,但并不是高性能功能代码的最佳示例。该操作归结为一个简单的
reduce
标签: javascript functional-programming