Module: chaining
Classes
Functions
chain
▸ chain(v
): FuncJS
<any
>
显式开启func.js的函数链,返回一个包裹了参数v的Func链式对象。
函数链使用惰性计算 —— 直到显示调用value()方法时,函数链才会进行计算并返回结果
Example
//3-5console.log(_([1,2,3,4]).map(v=>v+1).filter(v=>v%2!==0).take(2).join('-').value())
Parameters
Name | Type |
---|---|
v | any |
Returns
FuncJS
<any
>
func.js对象
default
▸ default(v
): FuncJS
<any
>
返回一个包裹了参数v的func.js对象,并隐式开始函数链。函数链可以链接func.js提供的所有函数,如
_([1,2,3,4]).map(v=>v+1).filter(v=>v%2===0).take(2).join('-').value()
函数链与直接调用方法的区别不仅在于可以链式调用,更在于函数链是基于惰性求值的。
上式中必须通过显式调用value()
方法才能获取结果,
而只有在value()
方法调用时整个函数链才进行求值。
惰性求值允许func.js实现捷径融合(shortcut fusion) —— 一项基于已有函数对数组循环次数进行大幅减少以提升性能的优化技术。 下面的例子演示了原生函数链和func.js函数链的性能差异
Example
let ary = _.range(20000000);console.time('native');let c = 0;let a = ary.map((v)=>{ c++; return v+1; }).filter((v) => { c++; return v%2==0; }) .reverse() .slice(1, 4)console.timeEnd('native');console.log(a, c, '次');//大约600ms左右,循环 40000000 次//func.jsary = _.range(20000000);console.time('func.js');let x = 0;let targets = _(ary) .map((v) => { x++; return v+1; }) .filter((v) => { x++; return v%2==0; }) .reverse() .slice(1, 4) .value();console.timeEnd('func.js');console.log(targets, x, '次');//大约0.5ms左右,循环 18 次
Parameters
Name | Type |
---|---|
v | any |
Returns
FuncJS
<any
>
func.js对象
mixin
▸ mixin(obj
): void
为func.js扩展额外函数,扩展后的函数同样具有函数链访问能力
Example
//增加扩展_.mixin({ select:_.get, from:_.chain, where:_.filter, top:_.head});const libs = [ {name:'func.js',platform:['web','nodejs'],tags:{utils:true},js:true}, {name:'juth2',platform:['web','java'],tags:{utils:false,middleware:true},js:false}, {name:'soya2d',platform:['web'],tags:{utils:true},js:true}];//查询utils是true的第一行数据的name值console.log(_.from(libs).where({tags:{utils:true}}).top().select('name').value())
Parameters
Name | Type | Description |
---|---|---|
obj | Record <string , Function > | 扩展的函数声明 |
Returns
void