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

更新日期: 2018-09-06阅读: 3k标签: 代码

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

函数式编程对应的是命令式编程, 函数式编程的核心当然是对函数的运用. 而高阶函数(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/

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

不要浪费时间写完美代码

一个系统可以维持5年,10年,甚至20年以上,但是代码和设计模式的生命周期非常短,当对一个解决方案使用不同的方法进行迭代的时候,通常只能维持数月,数日,甚至几分钟的时间

Google内部在代码质量上的实践

良好的编程习惯涉及到很多方面,但在软件行业内,大多数的公司或组织都不会把良好的编程习惯列为主要关注点。 例如,具有可读性和可维护性的代码比编写好的测试代码或使用正确的工具更有意义,前者的意义在于可以让代码更易于理解和修改。

减少嵌套,降低代码复杂度

减少嵌套会让代码可读性更好,同时也能更容易的找出bug,开发人员可以更快的迭代,程序也会越来越稳定。简化代码,让编程更轻松!

关于 Google 发布的 JS 代码规范

Google为了那些还不熟悉代码规范的人发布了一个JS代码规范。其中列出了编写简洁易懂的代码所应该做的最佳实践。代码规范并不是一种编写正确JavaScript代码的规则,而是为了保持源代码编写模式一致的一种选择。

你解决的问题比你编写的代码更重要!

程序员似乎忘记了软件的真正目的,那就是解决现实问题。您编写的代码的目的是为了创造价值并使现有世界变得更美好,而不是满足您对自我世界应该是什么的以自我为中心的观点。有人说:如果你拥有的只是一把锤子,那么一切看起来都像钉子一样

tinymce与prism代码高亮实现及汉化的配置

TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,由JavaScript写成。它对IE6+和Firefox1.5+都有着非常良好的支持。功能方强大,并且功能配置灵活简单。另一特点是加载速度非常快的。

接手代码太烂,要不要辞职?

朋友发表了一条说说:入职新公司,从重构代码到放弃”,我就问他怎么了?他说,刚进一家新公司,接手代码太烂,领导让我先熟悉业务逻辑,然后去修复之前项目中遗留的bug,实在不行就重构

js高亮显示关键词_页面、搜索关键词高亮显示

页面实现关键词高亮显示:在项目期间遇到一个需求,就是搜索关键词时需要高亮显示,主要通过正则匹配来实现页面关键词高亮显示。在搜索结果中高亮显示关键词:有一组关键词数组,在数组中筛选出符合关键字的内容并将关键字高亮

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

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

js原生代码实现鼠标拖拽(超简单)

这些样式都不是重要的,这里加个margin是为了让其出现拖拽的时候出现鼠标偏移,好做演示而已,不然margin:0 auto 就可以实现盒子的居中,首先通过offsetLeft的方法获取到盒子的偏移值,然后在通过clientX,clientY获取到鼠标的坐标

点击更多...

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