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

更新日期: 2018-09-06阅读量: 1431标签: 代码

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

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

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

让别人夸你的 JS 写得漂亮

网上有不少关于 JS 编写优化建议,这里我根据自己的经验提出一些比较有用的意见。JS 是弱类型的,但是写代码的时候不能太随意,写得太随意也体现了编码风格不好。下面分点说明:

像盖房子一样写代码

像盖房子一样写代码:当我以测试驱动开发的时候,我在想些什么?当我写一个功能模块方法时,我在想些什么?实际上思路可能是在写代码或者写测试的过程中不断的改进和完善的。

32个JavaScript工作中常用的代码片段

初衷: 整理一下工作中常用的JavaScript小技巧分享给大家,希望能帮助到各位小伙伴们,在工作中提升开发效率。适合人群: 前端初级开发,大佬绕道。

前端代码经常见到的Provider是什么

不知道你有没有在某处见过 xxProvider,Provider 并不是 23 种经典设计模式之一,但是却应用特别多,可以算是一种比较新的模式。Angular2 中提供了创建对象的时候基于 Provider

HTML、CSS、meta常用代码

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

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

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

什么样的代码叫好代码?

代码的本质还要在机器上运行,好的代码不单单的纯粹的简单的几个字符的问题,好的代码不仅仅是排版上或者语法上好看,还要能经过产品的测试验证,这是评判代码好坏的最准确的标准

散布JS无限循环代码,日本13岁女学生被抓

近日,一名13岁女孩被指控传播未经授权的恶意程序。警方近日质询并指控了一名13岁的女学生,起因是她将一段恶意代码的链接放到了在线公告栏上,广泛传播代码。这段有问题的恶意代码是弹出警告消息的无限循环,每当你点击确定就会立即显示新的消息。

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

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

前端代码评审通常注意些什么?

代码评审又称为(Code Review,简称CR),关于CR,开发同学其实都不陌生,现在大部分公司的项目开发流程中,它都是必不可少的一个环节,CR的好处也都耳熟能详。不同的公司对于CR的方式、质量要求标准都不一样

点击更多...

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