evaluate - <% … %> 执行任意的 JavaScript 代码
// 1、使用 "interpolate" 分隔符创建编译模板 var compiled = _.template('hello <%= user %>!'); compiled({ 'user': 'fred' }); // => 'hello fred!' // 1.1、使用 ES 分隔符代替默认的 "interpolate" 的 ERB 分隔符(ERB:嵌入式Ruby) var compiled = _.template('hello ${ user }!'); compiled({ 'user': 'pebbles' }); // => 'hello pebbles!' // 1.2 使用自定义的模板分隔符 // 修改 _.templateSettings // 略 // 2、使用 HTML "escape" 转义数据的值 var compiled = _.template('<b><%- value %></b>'); compiled({ 'value': '<script>' }); // => '<b>&\lt;script&\gt;</b>' // 3、使用 "evaluate" 分隔符执行 JavaScript 和 生成HTML代码 var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>'); compiled({ 'users': ['fred', 'barney'] }); // => '<li>fred</li><li>barney</li>' // ———————————————————————————————————————————— // 使用反斜杠符号作为纯文本处理 var compiled = _.template('<%= "\\<%- value %\\>" %>'); compiled({ 'value': 'ignored' }); // => '<%- value %>' // 使用 `imports` 选项导入 `jq` 作为 `jQuery` 的别名 var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>'; var compiled = _.template(text, { 'imports': { 'jq': jQuery } }); compiled({ 'users': ['fred', 'barney'] }); // => '<li>fred</li><li>barney</li>'template 还提供预编译的功能:
1、提高性能
2、方便调试(可使用 sourceURLs 提供错误的代码行号和堆栈跟踪)
预编译的详细用法 待写。
10、Util (1)range - 生成范围range/rangeRight - 用来创建整数灵活编号的列表的函数。
应用:
便于 each 和 map 循环。
模拟测试数据
_.range(4); // => [0, 1, 2, 3] _.range(-4); // => [0, -1, -2, -3] _.range(1, 5); // => [1, 2, 3, 4] _.range(0, 20, 5); // => [0, 5, 10, 15] _.range(0, -4, -1); // => [0, -1, -2, -3] _.range(1, 4, 0); // => [1, 1, 1] _.range(0); // => [] (2)defaultTo - 返回默认值defaultTo - 如果 value 为 NaN, null, undefined,那么返回 defaultValue(默认值)。
应用:替换非法值,保证程序可以顺畅往下执行。
_.defaultTo(1, 10); // => 1 _.defaultTo(undefined, 10); // => 10 (3)times - 屡次调用调用函数 n 次,每次调用返回的结果存入到数组中
应用:
快速模拟数据
实现无参数循环
_.times(4, _.constant(0)); // => [0, 0, 0, 0] (4)attemptattempt - 调用 function,获得返回的结果或错误对象。
应用:可替代写出来繁琐的 try-catch,如针对 JSON.parse。
var elements = _.attempt( function(arr) { return arr[4].a ; }, [1, 2, 3] ); if (_.isError(elements)) { console.log(elements); } (5)overEvery / overSomeoverEvery /overSome
应用:校验参数格式合法性
var func = _.overEvery([Boolean, isFinite]); func('1'); // => true func(null); // => false func(NaN); // => false var func = _.overSome([Boolean, isFinite]); func('1'); // => true func(null); // => true func(NaN); // => false (6)condcond - 创建了一个函数,这个函数会迭代pairs(下面会介绍什么是pairs):依次执行pairs左值的函数,若返回 true 则返回 执行pairs右值的函数 的结果并结束;若返回 false 则继续往下,如果都是 false ,则最终返回 undefined。
应用:可以代替繁琐的 ifesle / switch 。
var func = _.cond([ [_.matches({ 'a': 1 }), _.constant('matches A')], [_.conforms({ 'b': _.isNumber }), _.constant('matches B')], // 最好有个这样的兜底,不然会返回undefined [_.stubTrue, _.constant('no match')] ]); func({ 'a': 1, 'b': 2 }); // => 'matches A' func({ 'a': 0, 'b': 1 }); // => 'matches B' func({ 'a': '1', 'b': '2' }); // => 'no match' 拓展:什么是 pairs ?pairs 是一种用数组描述数据的格式。
如对象 { 'fred': 30, 'barney': 40 } 可以表示为 [['fred', 30], ['barney', 40]] 。
lodash 提供了两个转换方法:
fromPairs
_.fromPairs([['fred', 30], ['barney', 40]]); // => { 'fred': 30, 'barney': 40 }toPairs
function Foo() { this.a = 1; this.b = 2; } Foo.prototype.c = 3; _.toPairs(new Foo); // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) (7)flow - 连续调用flow / flowRight - 每一个调用,传入的参数都是前一个函数返回的结果。