接着第一篇《动手DIY一个underscorejs库及underscorejs源码分析1》
所有代码挂在我的github上。
1.兼容requirejs和seajs模块化
- requirejs
在代码的尾部加上
1 | if (typeof define == 'function' && define.amd) { |
使用测试:代码请点我
demo3.html
1 | <body> |
demo3.js1
2
3
4
5define(function(require) {
require(['../DIY/2/_underscore'], function() {
console.log(_);
});
});
- 加上支持seajs的代码
1 | if (typeof define == 'function' && define.amd) { |
使用:
demo2.html
1 | <script src="lib/sea-debug.js"></script> |
demo2.js
1 | define(function(require, exports, module) { |
2.支持nodejs
1 | root._ = _; |
修改为:
1 | if (typeof exports != 'undefined' && !exports.nodeType) { |
3._.extend
使用:
1 | console.log(_.extend({name: 'moe'}, {age: 50})); |
1 | //类似与_.keys |
主函数:
1 | var createAssigner = function(keysFunc, defaults) { |
4.重要内部函数cb
1 | var builtinIteratee; |
4.1 _.identity
很简单但是是默认的迭代器1
2
3_.identity = function(value) {
return value;
};
测试很简单1
2var obj1 = {name:'zry'};
console.log(obj1 === _.identity(obj1));//true
4.2 _.matcher
1 | _.matcher = _.matches = function(attrs) { |
测试:
1 | var obj2 = {selected: true, visible: true}; |
4.3 _.property
property函数在第一篇博客中已经实现1
_.property = property;
5._.map
1 | _.map = _.collect = function(obj, iteratee, context) { |
6._.filter
1 | _.filter = _.select = function(obj, predicate, context) { |
测试:1
var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });//[2,4,6]
7.两个常用的工具函数_.escape
,_.unescape`
7.1 _.escape
要过滤的字符串1
2
3
4
5
6
7
8var escapeMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
'`': '`'
};
主函数1
2
3
4
5
6
7
8
9
10
11
12var createEscaper = function(map) {
var escaper = function(match) {//match 匹配的子串
return map[match];
};
var source = '(?:' + _.keys(map).join('|') + ')';
var testRegexp = RegExp(source);
var replaceRegexp = RegExp(source, 'g');
return function(string) {
string = string == null ? '' : '' + string;
return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
};
};
注意值了的string.replace
函数第二个参数是个函数,那么返回的数据第一个是match(匹配的子串)
变量名 | 代表的值 |
---|---|
match | 匹配的子串。(对应于上述的$&。) |
p1,p2, … | 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。) |
offset | 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是“abcd”,匹配到的子字符串时“bc”,那么这个参数将是1) |
string | 被匹配的原字符串。 |
1 | _.escape = createEscaper(escapeMap); |
测试:1
console.log(_.escape('Curly, Larry & Moe')//Curly, Larry & Moe
7.2 _.unescape
反转要过滤的字符串1
2
3
4
5
6
7
8
9
10_.invert = function(obj) {
var result = {};
var keys = _.keys(obj);
for (var i = 0, length = keys.length; i < length; i++) {
result[obj[keys[i]]] = keys[i];
}
return result;
};
var unescapeMap = _.invert(escapeMap);
_.unescape = createEscaper(unescapeMap);
测试:1
console.log(_.unescape('Curly, Larry & Moe'));//Curly, Larry & Moe
参考阅读: