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

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

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

函数式编程对应的是命令式编程, 函数式编程的核心当然是对函数的运用. 而高阶函数(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.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

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

掌握依赖注入5大原则,无需额外编代码!

如果是第一次接触这个概念,可能会一时没有头绪,网上的各种解释可能会让你更加混乱,并觉得它没那么简单。 其实依赖注入本身是单纯、简单的。简单来说,依赖注入是一种方式、方法或者说手段

用什么工具保证一致的代码风格?

首先这个问题展开来讲就是:如何在Node.js模块编写中保持代码一致性风格,目前来说基本上有四种工具可以完成JSLint,JSHint,JSCS,ESLint。

写优雅的代码,做优雅的程序员

软件工程学什么? 学计算机,写程序,做软件,当程序员。听说学计算机很辛苦? 是的,IT行业加班现象严重。在计算机世界里,技术日新月异,自学能力是程序员最重要的能力之一。选了这个专业,就要时刻保持好奇心和技术嗅觉,不能只满足于完成课内作业。

如何增强前端代码的健壮性?

前端页面的成功呈现,不仅要求在理想情况下没问题,当一些后台接口访问异常、静态文件获取失败时,仍然需要尽可能提供降级方案或给用户良好的反馈,不至于整个页面的奔溃

Js代码整洁之道

最近在做一些项目重构的工作,看了不少脏乱差的代码,身心疲惫。本文将讨论如何编写整洁的代码,不求高效运行,只求可读性强,便于维护。

当一个程序员写不出代码了,该怎么办?

即使是最优秀的程序员也会遭遇无法解决的软件工程问题。碰到这样的问题,并不一定意味着你缺乏技能或知识。编程不是一项容易的工作,我们可以通过采取非正统的方法来保持你想要的生产力水平

TypeScript 来做依赖注入的限制

依赖注入 是编写可测试/复用代码的关键。 在 TypeScript 中所有对象、属性和方法都有类型,可以大幅简化人工标注的代码,这让很多人重新考虑在 JavaScript 中实现依赖注入。 比如 Angular2 以后的 DI 实现

把同事的代码重写得干净又整洁,老板却让我做回滚?

我的同事把这周写的代码提交了。我们在开发一个图形编辑器画布,已经实现了形状调整功能,即通过拖拽形状边缘的手柄来调整形状(比如矩形和椭圆形)。代码可以运行。

为什么程序员总是写糟糕的代码?

我一下子想到的最明显的原因是,有好的程序员,也有不那么好的程序员,有的人技术水平高,有的人水平却低,有人对这门技艺感兴趣,但也有的人却不愿意在工作之外学习其他。

你写的代码就是你的犯罪证据

最近我工作的主要内容,是在和别人结对编程,以对一个大型的遗留系统项目进行重构。过程中,我发现一个特别有意思的东西,我重构了很多的 if 语句。

点击更多...

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