命令式编程
命令计算机去做事情,注重过程,一步一步的进行代码描述,不管需要实现什么样的功能,都会按照命令完成
// 第一步创建一个数组
let numbers = [1,2,3,4,5]
// 第二步创建一个新的数组
let doubled = []
// 第三步遍历数组将元素处理后推入新的数组
for(let i = 0; i < numbers.length; i++) {
var newNumber = numbers[i] * 2
doubled.push (newNumber)
}
console.log (doubled) //=> [2,4,6,8,10]
命令式编程的典型应用是JQ 命令式编程的优点是直接操作目标,性能在一定程度上优于函数式编程,但是代码可维护性和可复用性较差
声明式编程
声明式编程只关注于结果,不关注实现的过程
var numbers = [1,2,3,4,5]
var total = numbers.reduce (function (sum, n) {
return sum + n
});
console.log (total) //=> 15
// 不用关注reduce的具体实现方法,只需要传入参数就能得到累加的结果
面向过程编程
面向过程编程属于命令式编程的一种实现
面向对象编程
面向对象编程也是命令式编程的一种实现,面向对象的特点是封装、继承和多态 在JS中,面向对象编程把逻辑与数据封装到函数与原型中,通过函数的原型链拷贝实现继承,而代码的运行逻辑与数据依然封装在函数内,但是做了属性与方法的区分
函数式编程
函数式编程是声明式编程的一种实现
把逻辑完全视为函数的计算。把数据与逻辑封装到函数中,通过对函数的计算,加工,处理,来生成新的函数,最后拼装成一个个功能独立的函数。在运用这些函数,完成复杂逻辑的实现
与现象对象不同的是,数据和逻辑封装到函数中而不是类与对象中。每个函数完全独立,好的函数式设计,每个函数都是一个纯函数(即输入固定参数,即可得到相同输入的函数)。优点是:
- 面向对象中的任何一个原型方法都会获得this的数据,而且可以轻易获取闭包的数据。这样的非纯函数非常难以提炼与抽象
- 纯函数由于输入与输出固定,所以非常容易单测。好的函数式中的函数设计,不会依赖于任何其他函数或者声明配置,只需要传递参数,既可以进行测试。而在面向对象语言中,往往需要启动整个工程,或者说所有依赖的类全部要加载,才能开始测试
- 对逻辑做抽象与提取,让我们避免在函数内做判断与循环,我们只需要把具体处理封装到函数中,而程序运行过程中的走向、判断与循环通常交给底层框架来处理,例如react和vue