面向对象抛异常的机制让函数变得不纯,把大部分的责任都推到了调用者的尝试(try-catch逻辑)上。
把值包裹到容器中的模式是为了构建无副作用的代码,把可能不纯的变化包裹成引用透明的过程。
使用Functor将函数应用到容器中的值,这是无副作用地、不可变地访问和修改操作。
Monad是函数式中用来降低应用复杂度的设计模式,通过这种模式可以将函数编排成安全的数据流程。
交错的组合函数和Monadic类型是非常有弹性且强大的,如Maybe, Either和IO。
面向对象抛异常的机制让函数变得不纯,把大部分的责任都推到了调用者的尝试(try-catch逻辑)上。
把值包裹到容器中的模式是为了构建无副作用的代码,把可能不纯的变化包裹成引用透明的过程。
使用Functor将函数应用到容器中的值,这是无副作用地、不可变地访问和修改操作。
Monad是函数式中用来降低应用复杂度的设计模式,通过这种模式可以将函数编排成安全的数据流程。
交错的组合函数和Monadic类型是非常有弹性且强大的,如Maybe, Either和IO。
1 | _.chain(names).filter(isValid).map(s => s.replace(/_/, ' ')).uniq().map(_.startCase).sort().values() |
函数式编程将管道视为构建程序的唯一方法。所选函数的输入和输出需要满足以下两个兼容条件:
1 | const trim = (str) => str.trim() |
不纯的代码在运行后会导致外部可见的副作用,导致访问的数据超出函数的作用域,导致外部依赖关系。只要有一个函数是不纯的,整个程序都会受影响。
但是,并不需要总是保证100%的纯函数以获得函数式编程的好处。理想情况下,开发者需要尽可能地分离纯的行为与不纯的行为,而且最好是在同一个函数中。
函数式编程使用以简单拓扑连接的独立的黑盒操作组合而成的较小结构化控制流,从而提升程序的抽象层次。这些连接在一起的操作只是一些能够将状态传递至下一个操作的高阶函数。
使用这种方式可以形成类似这样的代码:
1 | optA().optB().optC().optD(); |
这种链式操作使得程序简洁、流畅并富有表现力,能够从计算逻辑中很好地分离控制流,因此可以使得代码和数据更易推理。
方法链是一种能够在一个语句中调用多个方法的面向对象编程模式。当这些方法属于同一个对象时,方法链又称为方法级联。
例如:
1 | 'Functional programing'.substring(0, 10).toLowerCase() + ' is fun'; |
lambda表达式(在js中也被称为箭头函数)源自函数式编程,比起传统的函数声明,它可以采用相对简洁的语法形式来声明一个匿名函数:
1 | const name = p =>p.fullname; |
递归函数包含以下两个主要部分:
这一章主要介绍了一些js的基础知识,比如函数是一等公民,闭包和作用域等。该内容便不再赘述了。
面向对象和函数式编程重要性质比较:
函数式 | 面向对象 | |
---|---|---|
组合单元 | 函数 | 对象(类) |
编程风格 | 声明式 | 命令式 |
数据和行为 | 独立且松耦合的纯函数 | 与方法紧耦合的类 |
状态管理 | 将对象视为不可变的值 | 主张通过实例方法改变对象 |
程序流控制 | 函数&递归 | 循环&条件 |
线程安全 | 可并发编程 | 难以实现 |
封装性 | 因为一切都是不可变的,所以没有必要 | 需要保护数据的完整性 |
第一章 走进函数式
第二章 高阶JavaScript
第三章 轻数据结构,重操作
第四章 模块化且可重用的代码
第五章 针对复杂应用的设计模式
第六章 坚不可摧的代码(略)
第七章 函数式优化
第八章 管理异步事件以及数据
Object.is() 确定两个值是否为相同值。如果以下其中一项成立,则两个值相同:
“恋爱是人格的交感共鸣,所以恋爱真纯的程度以人格高下为准。一般人误解恋爱,动于一时飘忽的性欲冲动而发生婚姻关系,境过则情迁,色衰则爱弛,这虽是冒名恋爱,实则只是纵欲。我为真正恋爱辩护,我却不愿为纵欲辩护,我愿青年应该懂得恋爱神圣,我却不愿青年在血气未定的时候,去盲目地假恋爱之名寻求泄欲。”
————《谈多元宇宙》
“人类比其他物类痛苦,就因为人类把自己看得比其他物类重要。人类中有一部分人比其余的人苦痛,就因为这一部分人把自己比其余的人看得重要。比方穿衣吃饭是多么简单的事,然而在这个世界里居然成为一个极重要的问题,就因为有一部分人要亏人自肥。再比方生死,这又是多么简单的事,无量数人和无量数物都已生过来死过去了。一个小虫让车轮压死了,或者一朵鲜花让狂风吹落了,在虫和花自己都决不值得计较或留恋,而在人类则生老病死以后偏要加上一个苦字。这无非是因为人们希望造物主宰待他们自己应该比草木虫鱼特别优厚。”
外观模式主要是为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使子系统更加容易使用。
外观模式的作用是对客户屏蔽一组子系统的复杂性。外观模式对客户提供一个简单易用的高层接口,高层接口会把客户的请求转发给子系统来完成具体的功能实现。大多数客户都可以通过请求外观接口来达到访问子系统的目的。但在一段使用了外观模式的程序中,请求外观并不是强制的。如果外观不能满足客户的个性化需求,那么客户也可以选择越过外观来直接访问子系统。
最简单的外观模式应该是类似下面的代码:
1 | const A = function(){ |
观察者模式定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
1 | let observerIds = 0 |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true