函数式编程

1.声明式(Declarativ)
和声明式相对应的编程⽅式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的⼀种编程⽅式。

//命令式编程:
function double(arr) {
const results = []
for (let i = 0; i < arr.length; i++){
results.push(arr[i] * 2)
}
return results
}
function addOne(arr){
const results = []
for (let i = 0; i < arr.length; i++){
results.push(arr[i] +1)
}
return results
}
//声明式:
const double = arr => arr.map(item => item * 2);
const addOne = arr => arr.map(item => item + 1);

2.纯函数(Pure Function)

  • 函数的执⾏过程完全由输⼊参数决定,不会受除参数之外的任何数据影响。
  • 函数不会修改任何外部状态,⽐如修改全局变量或传⼊的参数对象。

相反的不纯函数:
改变全局变量的值。

  • 改变输⼊参数引⽤的对象,就像上⾯不是纯函数的arrayPush实现。
  • 读取⽤户输⼊,⽐如调⽤了alert或者confirm函数。
  • 抛出⼀个异常。
  • ⽹络输⼊/输出操作,⽐如通过AJAX调⽤⼀个服务器的API。
  • 操作浏览器的DOM。

满⾜纯函数的特性也叫做引⽤透明度(Referential Transparency),这是更加正式的说法。怎么称呼不重要,重要的是开发者要理解,所谓的纯函数,做的事情就是输⼊参数到返回结果的⼀个映射,不要产⽣副作⽤(Side Effect)。
3.数据不可变性(Immutability)
数据不可变(Immutable)是函数式编程⾮常重要的⼀个概念,程序要好发挥作⽤当然是要产⽣变化的数据,但是并不意味着必须要去修改现有数据,替换⽅法是通过产⽣新的数据,来实现这种“变化”,也就是说,当我们需要数据状态发⽣改变时,保持原有数据不变,产⽣⼀个新的数据来体现这种变化。不可改变的数据就是Immutable数据,它⼀旦产⽣,我们就可以肯定它的值永远不会变,这⾮常有利于代码的理解。
注意:JavaScript中的const关键字虽然有常数(constant)的意思,但其实只是规定⼀个变量引⽤的对象不能改变,却没有规定这个const变量引⽤的对象⾃⾝不能发⽣改变,所以,这个“常量”依然是变量。
问题:javascript算不算函数式编程语言?
从语言的角度上讲,javascript并是纯粹的函数式编程语言,JavaScript中的函数有第⼀公民的⾝份,因为函数本⾝就是⼀个对象,可以被赋值给⼀个变量,可以作为参数传递,由此可以很⽅便地应⽤函数式编程的许多思想。我们把函数式编程看作⼀种编程思想,即使语⾔本⾝不⽀持⼀些特性,我们依然可以应⽤这样的编程思想,⽤于提⾼代码的质量。所以,JavaScript并不是纯粹的函数式编程语⾔,但是,通过应⽤⼀些编程规范,再借助⼀点⼯具的帮助,我们完全可以⽤JavaScript写出函数式的代码,RxJS就是辅助我们写出函数式代码的⼀种。

响应式编程(Reactive Programming)

就像excell,试着⽤Excel把多个星期的花费综合加起来放在另⼀个叫c9格⼦⾥,c9能够对花费的格⼦的数值变化作出“响应”。

Reactive Extension (响应式编程世界⾥知名度最⾼的框架)

An API for asynchronous programming with observable streams 。 Rx是⼀套通过可监听流来做异步编程的API。
Rx其实是⼀个⼤家族,在这个⼤家族中,还有⽤Java实现的RxJava,⽤C++实现的RxCpp,⽤Ruby实现的Rx.rb,⽤Python实现的RxPy,当然,还有这个⼤家族中最年长的Rx.NET。RxJS,也就是Rx的JavaScript语⾔实现。

RxJS简介的更多相关文章

  1. RxJS 简介:可观察对象、观察者与操作符

    RxJS 简介:可观察对象.观察者与操作符 对于响应式编程来说,RxJS 是一个不可思议的工具.今天我们将深入探讨什么是 Observable(可观察对象)和 observer(观察者),然后了解如何 ...

  2. RxJS的基础

    RxJS是一个强大的Reactive编程库,提供了强大的数据流组合与控制能力,但是其学习门槛一直很高,本次分享期望从一些特别的角度解读它在业务中的使用,而不是从API角度去讲解. RxJS简介 通常, ...

  3. RxJS 入门指引和初步应用

    作者:徐飞链接:https://zhuanlan.zhihu.com/p/25383159来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. RxJS是一个强大的React ...

  4. [译]RxJS 5.X基础篇

    欢迎指错与讨论 : ) 当前RxJS版本:5.0.0-beta.10.更详细的内容尽在RxJS官网http://reactivex.io/rxjs/manual/overview.html.文章比较长 ...

  5. 一起来看 rxjs

    更新日志 2018-05-26 校正 2016-12-03 第一版翻译 过去你错过的 Reactive Programming 的简介 你好奇于这名为Reactive Programming(反应式编 ...

  6. .NET Core/.NET之Stream简介 Rx.NET 简介

    .NET Core/.NET之Stream简介   之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core ...

  7. 响应式js库——rxjs

    原文地址:https://rxjs.dev/guide/overview 简介 RxJS 是组合异步以及基于事件的使用可观察者序列的程序类库.它提供一个核心类型,Observable,附属类型(Obs ...

  8. 【转】Rxjs知识整理

    原文:https://www.jianshu.com/p/16be96d69143 ---------------------------------------------------------- ...

  9. RxJS + Redux + React = Amazing!(译一)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...

随机推荐

  1. 《ServerSuperIO Designer IDE使用教程》-3.Modbus协议,读取多个寄存器,实现多种数据类型解析。发布:v4.2.2版本

    更新内容,v4.2.2版本:1.增加Modbus协议读取多个寄存器,并且按多种数据类型解析数据.2.Modbus Serial和Modbus TCP两个驱动合并成一个驱动.3.修改数据库结构,保存配置 ...

  2. MBR分区操作-增加、扩展、删除

    MBR分区操作-增加.扩展.删除 GPT分区参考 http://www.blogjava.net/haha1903/archive/2011/12/21/366942.html l  fdisk 显示 ...

  3. C++11 带来的新特性 (3)—— 关键字noexcept

    1 关键字noexcept 从C++11开始,我们能看到很多代码当中都有关键字noexcept.比如下面就是std::initializer_list的默认构造函数,其中使用了noexcept. co ...

  4. day19其他模块

    collections模块 详细内容 http://www.cnblogs.com/Eva-J/articles/7291842.html 1.namedtuple: 生成可以使用名字来访问元素内容的 ...

  5. C++结构体与Delphi结构体相互传参,结构体中包含结构体的嵌套,数组指针

    //结构体的声明 typedef struct Mwinddirectbaseline { char* p; int s; int i; }Mwinddirectbaseline; typedef s ...

  6. Scrapy架构概述

    Scrapy架构概述 1, 从最初自己编写的spiders,获取到start_url,并且封装成Request对象. 2,通过engine(引擎)调度给SCHEDULER(Requests管理调度器) ...

  7. 为什么目前无法再docker for windows中调用GPU

    本随笔记载与2019年1月23日,若随着技术发展,本随笔记录的困难被攻克也是可能的. 参考(https://www.reddit.com/r/docker/comments/86vzna/gpu_ac ...

  8. BZOJ3497 : Pa2009 Circular Game

    令先手为$A$,后手为$B$,将相邻同色棋子合并成块,首先特判一些情况: 如果所有格子都是满的,那么显然$A$必败. 否则如果所有块都只有一个棋子,那么显然平局. 枚举$A$的第一步操作,如果可以使得 ...

  9. Linux 下redis 集群搭建练习

    Redis集群 学习参考:https://blog.csdn.net/jeffleo/article/details/54848428https://my.oschina.net/iyinghui/b ...

  10. 一步一步 copy163: 网易严选 ---- vue-cli

    面试点 组件间通信 生命周期函数 路由 - 参数 - 重定向 vuex 参考 网易严选商城小程序全栈开发,域名备案中近期上线(mpvue+koa2+mysql) 小程序服务端源码地址 小程序源码地址 ...