关闭

js函数式编程与代码执行效率

时间: 2018-09-06阅读: 1047标签: 代码

偶尔我也有意识的读一些关于函数式编程的文章, 虽然在工作中实践的机会不多, 但我十分喜欢函数式编程的风格. 在现代浏览器中, 使用函数式编程实用且高大上.

函数式编程对应的是命令式编程, 函数式编程的核心当然是对函数的运用. 而高阶函数(Higher-order)是实现函数式编程的基本要素

高阶函数可以将其他函数作为参数或者返回结果。所以js天生就支持函数式编程, 但 java 则不是(最近版本加入了)

下面简单列举一些函数式编程的特性


1, 没有for循环

虽然这根本不是个正经的(真不正经)的函数式特性,但确实是肉眼最容易看出来的特性.就如同用了 for 循环就不是函数式编程了一样

因为函数式编程必定提供替代for循环的方法, 例如随便列举几个大家耳熟能详的方法: forEach, filter, some, every, find, reduce


2,纯函数(pure-function)

纯函数即没有”副作用”的函数. 所谓的副作用是: 函数操作了其自身作用域之外的值.

这个要求对于我这种习惯命令式开发的人有点苛刻, 而且,大部分人都喜欢跨作用域干事.

另外函数式编程也要求: 函数必须要有返回值


3,柯里化(currying)

currying很简单, 就是将一个需要多个参数的函数,转成只需要一个参数(但实际很可能多于1个)的函数. 剩下的参数去哪儿了呢? 先缓存起来了.如:

function peopleAction(name, action) {
    console.log(name, ',', action);
}

function getPeople(name) {
    return function(action) {
        peopleAction(name, action);
    };
}

var john = getPeople('john'); //把名字固定住

john('walk');
john('shout');
john('jump');

可以看出要实现currying, 高阶函数是必不可少的


函数式编程效率

函数式编程会让代码变得简洁干净, 易读, 易于测试, 但无奈的是, 在现有条件下, js中函数式编程会带来效率上的损耗. 见这个测试:

https://jsperf.com/imperative-vs-fuctional-code-test

函数式编程讲究函数拆分, 为了方便重用, 提倡将过程式代码提取成一个个函数, 过程式代码变成了一个个的函数调用. 但对于很多一次性使用的处理逻辑, 没必要这样做.

函数式编程为了简洁, 有时候不得不牺牲性能. 如上面链接中的测试代码, 命令式编程是这样的:

var kittens = []
for (var i = 0; i < cats.length; i++) {
  if (cats[i].months < 7) {
    kittens.push(cats[i].name)
  }
}


函数式是这样的:

var kittens =
  cats.filter(function(cat){return cat.months < 7})
      .map(function(cat) {return cat.name})

因为表面上 filter与map 不能只靠自己一次性达到获取满足条件对象, 又取出其 name 的操作 (其实有, 用 reduce), 所以这里实际上有两个循环: filter一个, map一个, 天生在性能上就有弱势

对这些性能损耗, 只能期待引擎的改进. 但人的智慧总是领先于现状, 现在, 很多知名的函数式编程风格库, 如 lazy.js 与 lodash, 为我们带来了 延时计算, 达成了效率上的飞跃(尤其是在大数据量时), 大家有兴趣自行了解下吧


原文来源:http://jo2.org/functional-programing-and-performance/

站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/1060

关闭

HTML、CSS、meta常用代码

关闭首个字母大写(HTML),伪类:active失效,设置页面的编码(HTML),禁止手机放大或缩小(HTML),删除默认的苹果工具栏和菜单栏,默认全屏(HTML),启动或禁用自动识别页面中的电话号码,邮箱、地址

前端代码美化的艺术

原本只是想简单的聊一下代码格式化的问题,无奈本文拖沓了很久,在此期间,我又思考了很多,我越来越觉得代码格式化是一门艺术。为了衬托“艺术”二字,可能叫“代码美化”更贴切一点,但是本文的深度远没有标题那么宏大

好代码的用处,怎么写出好代码?

实际上本书建立在一个相当不可靠的前提之上:好的代码是有意义的。我见过太多丑陋的代码给他们的主人赚着大把钞票,所以在我看来,软件要取得商业成功或者广泛使用

js优秀代码

es6数组去重此技巧适用于包含基本类型的数组:undefined,null,boolean,string和number。(如果你有一个包含对象,函数或其他数组的数组,你需要一个不同的方法!)

程序员吐槽:经常熬夜敲代码,谈了四年的女朋友提出分手了

这年头说起程序员,普通人都会很羡慕他们的高薪,毕竟刚工作就可以月薪上万,三五年工作月薪两万,干一年相当于普通人干个5年的,谁又能不眼红呢?不过程序虽然高薪,但也有自己的苦处。

如何阅读别人的代码?

比起阅读代码,我更喜欢看别人的文章或者书。我喜欢他们跟我面对面的交流,用简单的自然语言或者画图解释他们的思想。有了思想,我自然知道如何把它变成代码,而且是优雅的代码

编写优秀CSS代码的8个策略

编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一。然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性。

源代码是什么意思

源代码(也称源程序),是指一系列人类可读的计算机语言指令。 在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。

黑客攻击用的最短代码是什么?

我们讲的是攻击过程中用到的代码,不是你攻击过程中准备的软件代码。我们讲的是现在应当能成功攻击的。不是你已经装好后门你去连接了,像菜刀服务端、跨站代码等。真正的dir溢出、现在很多黑客黑了服务器之后,会装一个shift后门。

【重构】使用 Hooks 让代码更易于变更

重构过程中,肯定会遇到新的代码如何做技术选型的问题,要考虑到这套技术的生命力,也就是他是否是更新的技术,还有他的灵活和拓展性,期望能够达到在未来至少 3 年内不需要做大的技术栈升级

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!