/**
* 函数式编程是非常古老的概念,早于第一台计算机的诞生
* 函数式编程(Functional Programming,FP)FP只是编程范式之一,我们常听说的编程范式还有面向过程编程,面向对象编程。
*
* 面向过程编程的思维方式:按照步骤来实现,一步一步的实现我们想要的功能
* 面向对象编程的思维方式:把现实世界中的事物抽象成程序世界中的类和对象,通过封装,继承和多态来演示事物之间的联系
* 函数式编程的思维方式:把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程进行抽象)
*
* 函数式编程的本质:
* 根据输入通过某种运算获得相应的输出,程序开发过程中会涉及很多输入和输出的函数
* 函数式编程中的函数指的不是程序中的函数(方法),而是数学中的函数既映射关系,例如:y=sin(x),x和y的关系
* 相同的输入始终会得到相同的输出(纯函数)
* 函数式编程用来描述数据(函数)之间的映射
*
* 为什么要学习函数式编程:
* 函数式编程是随着react的流行受到越来越多的关注 react中的高阶组件使用了高阶函数来实现,高阶函数是函数式编程的一个特性,react并不是纯函数式的
* vue3开始拥抱函数式编程
* 函数式编程可以抛弃this
* 打包过程中可以更好的利用tree shaking过滤无用代码
* 方便测试,方便并行处理
* 有很多库可以帮助我们进行函数式开发:lodash、underscore、ramda
*/
/**
* 纯函数和不纯的函数
* slice() /splice
*/
let array = [1, 2, 3, 4, 5]
//纯函数(相同的输入得到相同的输出)
console.log(array.slice(0, 3)) //输出:[ 1, 2, 3 ]
console.log(array.slice(0, 3)) //输出:[ 1, 2, 3 ]
console.log(array.slice(0, 3)) //输出:[ 1, 2, 3 ]
//不纯的函数 (改变了原来的数组,相同的输入没有得到相同的输出)
console.log(array.splice(0, 3)) //输出:[ 1, 2, 3 ]
console.log(array.splice(0, 3)) //输出:[ 4,5 ]
console.log(array.splice(0, 3)) //输出:[ ]
//纯函数
function add(a, b) {
return a + b
}
//函数式编程一定要有输出和输出,而且相同的输入永远得到相同输出
console.log(add(1, 2)) //输出:3
console.log(add(1, 2)) //输出:3
console.log(add(1, 2)) //输出:3
/**
* slice: 返回数组中的指定部分,不会改变原数组
* splice:对数组进行操作返回该数组,会改变原数组
*
* 纯函数:
* 1:相同的输入永远会得到相同的输出,并且没有任何可观察的副作用。
* 2:纯函数就类似数学中的函数(用来描述输入和输出的关系),y=f(x)
*
* 函数式编程不会保留计算中间的结果,所以变量是不可变的(无状态的)
* 可以把一个函数的执行结果交给另外一个函数去处理
* 函数式编程可以无数次的重用,函数式编程的过程中抽象出来的函数是细粒度的函数,这些函数将来可以组合成更强大的函数
*/