纯函数

纯函数

ES6中Array新增的一些方法,纯函数是什么,副作用理解

2018-08-24侠课岛    中级进阶       

前端/前端/ES6函数式编程 14     0     1469

先来看下es6+Array新增的一些方法

Array.prototype.copyWithn(),在当前数组内部,将指定位置上的成员复制到数组的其他位置,会把该位置上的元素覆盖,然后返回当前数组。

/**
 * target 要替换的位置
 * start 从该位置开始读取数据,默认是0。可为负数,负数则从数组倒数
 * end 到这个位置前停止读数据,默认是this.length。可为负数,负数则从数组倒数
 */
Array.prototype.copyWithin(target, start = 0, end = this.length)
const arr = [0,1,2,3,4,5,6,7]
arr.copyWithin(1, 2, 3)
console.log(arr) // [ 0, 2, 2, 3, 4, 5, 6, 7 ]

Array.prototype.includes()方法返回一个布尔值,表示某个数组是否包含给定的值,是es7提出的。

const arr = [0,1,2,3,4,5,6,7]
arr.includes(3) // true
arr.includes(333) // false
console.log(arr)  // [ 0, 1, 2, 3, 4, 5, 6, 7 ]

对比上面两个方法会发现,执行 Array.prototype.copyWithn() 之后,原数组发生了变化,而执行 Array.prototype.includes() 之后,并没有对原数组有影响。在原生的方法中还有很多类似的方法,那在函数式编程中,会把这两类方法用纯函数概念区分,不会改变原数据的函数称之为纯函数,否则就称之为非纯函数。

纯函数是函数式编程的基础,理解好纯函数,可以帮助我们更好的进行函数式编程。

纯函数是一种对于相同的输入,永远只会有相同输出的函数,不会产生任何的副作用。

如何理解这个概念呢,换个角度其实就是要理解怎么样的作用才是副作用,毕竟每个函数都是有作用的。

副作用是在函数运行期间,系统状态或运行环境的一种改变,或在代码层面上改变了外部的内容。概括来说,只要给函数外部环境或代码发生了交互的都是副作用。

具体的副作用形式可能是:

  • 读写系统文件
  • 发送请求
  • console/日志
  • 读取操作全局变量
  • 获取用户行为
  • 变更函数外的数据
  • ...

所以,纯函数关注的都是输入结果和输出的关系,纯函数的输出结果必须只依赖于它的输入参数,不受外部因素的影响,同时纯函数在运算过程中,也不应该给外部因素产生副作用;

但是,如果一个函数运行完毕之后不发生些什么,那就总觉得意义并不是那么大,所有并不是说一定要循规蹈矩的遵循规则编写纯函数不产生任何的作用,而是应该通过某些方式,避开产出不必要的副作用,使输入数据从进入函数到从函数返回的过程中,只在内部发生变更。

有这样的场景,统计某种类型的数据有多少

const data = ['BeiJing', 'ShangHai', 'ShenZhen', 'ChongQin', 'ShangHai']
const type = 'ShangHai'

const getData = (data = []) => {
    return data.filter((cur, index, arr) => {
        return cur == type
    })
}
getData(type)   // [ 'ShangHai', 'ShangHai' ]

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

14

本课评分:
  •     非常好
难易程度:
  •     适中的
|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?