javascript函数式编程之 声明式编程(declarative programing)

定义

在计算机科学中,声明式编程是一种编程范式 – 构建计算机程序的结构和元素的一种风格 – 专注于表达计算逻辑,而不需要描述其控制流程。

应用这种风格的许多语言尝试通过描述程序在问题领域中必须完成的内容来最大限度地减少或消除副作用,而不是描述如何将其作为编程语言原函数的序列直到实现。这与命令式编程相反,命令式编程在显式步骤中实现算法。 继续阅读“javascript函数式编程之 声明式编程(declarative programing)”

javascript函数式编程之 无参风格(point-free style)

定义

无参风格是一种编程范例,其中函数定义不能识别它们所运行的参数(或“点”)。 相反,它只是组合(compose)其他函数,在其子函数中操纵参数的组合器。
因为严格使用组合可以很好地适应等式推理的程序,它也是某些编程语言的自然风格,包括APL和诸如Forth之类的连接语言。
例子如下: 继续阅读“javascript函数式编程之 无参风格(point-free style)”

javascript函数式编程之 柯里化(curry)

定义

柯里化(curry)的概念其实可以简单理解为这样,本来有个已存在的函数需要接收多个参数的,现我想要根据需求由此函数打造成一个只有一个或者指定数量参数的新的函数。这里我们引用lodash库来举例,如下:
<script src="https://cdn.bootcss.com/lodash.js/4.17.4/lodash.min.js"></script> 继续阅读“javascript函数式编程之 柯里化(curry)”

javascript函数式编程之 函数组合(compose)

定义

在函数式编程使用过程中,组合(compose)简单来说就是把两个你喜欢的接入参数一样(最好都是一参的形式,可能过柯里化curry把多参转为一参)的函数把它们组合到一起,产生一个新的函数。如下:

var compose = function(f, g) {
  return function(x) {
    return f(g(x));
  };
};

在这里,我们把fg两个函数组合到一起,它们有共同的参数x,显然在compose组合时,函数的执行顺序是由右向左执行,先执行g(x)再执行f(g),可称之为“左倾”。使用起来如下: 继续阅读“javascript函数式编程之 函数组合(compose)”

javascript 高阶函数

定义

在js的世界里面,有一种函数,它可以接受另一个函数作为参数,这种函数,我为称之为高阶函数(Higher-order function)。我们日常使用过程中非常常见的一种形式就是回调函数,我们经常在写的带callback的函数,其实属于高阶函数;setTimeOut、setInterval可以接收函数进行异步操作;Array.sort也可以接收函数进行排序处理;进入ES6时代,Gruntjs、Gulp和webpack等打包工具的出现,我们可以大胆使用ES6/ES7的一些新的函数,如map、reduce、filter等函数

高阶函数好处

新入门的程序员通常都会疑惑将函数作为参数传递在哪些地方才有用呢?在很多程序中,都有一两个这种实例:有一些基本的算法会被编写多次,但是可能每次稍有不同。这就是发挥使用函数作为参数所长的地方。 继续阅读“javascript 高阶函数”

当年练手FreeCodeCamp中的高级算法编码题 [源码]

一、Validate US Telephone Numbers 美国电话号码正则匹配

代码如下:

function telephoneCheck(str) {
  // Good luck!
  var arr = str.match(/1?\s?\d{3}[\s-]?\d{3}[\s-]?\d{4}|1?\s?\(\d{3}\)[\s-]?\d{3}[\s-]?\d{4}/);
  return arr!==null && arr[0].length === str.length;
}


telephoneCheck("555-555-5555");

二、Record Collection 更新对象记录集

代码如下: 继续阅读“当年练手FreeCodeCamp中的高级算法编码题 [源码]”

当年练手FreeCodeCamp中的中级算法编码题 13-21 [源码]

十三、Sum All Odd Fibonacci Numbers 斐波纳契数列求和

思路
循环求和

代码如下:

function sumFibs(num) {
        var pre = 0,
            now = 1,
            next = 1,
            r = 0;
        while (pre <= num) {
            if (pre % 2 === 1) {
                r += pre;
            }
            if (now <= num && now % 2 === 1) {
                r += now;
            }
            pre = next;
            now = now + next;
            next = next + now;
        }
        return r;
}

sumFibs(4);

十四、Sum All Primes 素数求和

思路
1、同上 继续阅读“当年练手FreeCodeCamp中的中级算法编码题 13-21 [源码]”

当年练手FreeCodeCamp中的js基础算法编码题12~16 [源码]

十二、Mutations 确认数组第二个字符串所有字符是否都在第一个串中出现

思路
1、循环第二个串每个字符检查是否在第一个串中出现

代码如下:

function mutation(arr) {
  var len = arr[1].length,
      a = arr[0].toLowerCase(),
      b = arr[1].toLowerCase();
  for(var i=0;i<len;i++){
    if(a.indexOf(b.charAt(i))<0){
      return false;
    }
  }
  return true;
}

mutation(["hello", "hey"]);

十三、Falsy Bouncer 把数组中所有false, null, 0, "", undefined, 和 NaN值元素去掉

思路继续阅读“当年练手FreeCodeCamp中的js基础算法编码题12~16 [源码]”