看下面这段代码
// 验证码: 4-6位数字,满足条件返回true,不满足返回false
function isCode (value: string) {
return /^\d{4,6}$/g.test(value)
}
其实上面这种就是谓词函数(predicate function),说简单也简单,说难也不简单。一个返回布尔值的函数或者仿函数,是一个判断式,还有就是一元二元的概念,一个入参就是 一元,两个入参就是二元,所以当一个谓词函数入参只有一个时,叫做一元谓词函数,也可叫谓词,如果入参有两个就必须带上二元,叫二元谓词了。这个很简单,不多说。
开始搞事情
首先我们提供几个一元谓词和特殊谓词构造器,为了演示,简单点。
// 是否为空
function isNotEmpty (value: string) {
return !!value;
}
// 有数字即可
function hasNumeric (value: string) {
return /\d{1,}/g.test(value);
}
// 有英文字母即可
function hasLetter (value: string) {
return /[a-zA-Z]{1,}/g.test(value);
}
// 特殊谓词函数构造器,他会返回一个谓词函数【闭包的应用】
function rangeLength(min: number, max: number) {
return (value: string) => value.length >= min && value.length <= max;
}
以上这些我一般叫他原子谓词,以为都是一个小的判断,很少再拆分,往往更多的是组合(compose)得到一个新的谓词函数。
骚操作
往往能吸引你点赞就是这里,毕竟够骚嘛。我们提供and(相当于&&),or(相当于 ||),not(相当于 !),也就是常说的且或非。
- 密码校验:非空,有数字或者有字母,并且长度在8-20位
// 版本一:不使用谓词,直接手撸正则
const isPwd = (value: string) => {
。。。。你自己慢慢搞
}
// 版本二:直接使用原子谓词,传这么多次value不厌烦吗?
const isPwd = (value: string) => {
return isNotEmpty(value) && hasNumeric(value) && hasLetter(value) && rangeLength(8,20)(value);
}
// 版本三:使用且或非操作组合出新的谓词函数,这不就简单了吗
const isPwd = and(isNotEmpty,or(hasNumeric,hasLetter),rangeLength(8,20));
怎么实现and、or、not
先自己思考,今天困了,明天分解。