前几天我对underscore.js的整体结构做了分析,今天我将针对underscore封装的方法进行具体的分析,代码的一些解释都写在了注释里,那么废话不多说进入今天的正文。没看过上一篇的可以猛戳这里:underscore.js源码解析(一)underscore.js源码GitH ...
前几天我对underscore.js的整体结构做了分析,今天我将针对underscore封装的方法进行具体的分析,代码的一些解释都写在了注释里,那么废话不多说进入今天的正文。
没看过上一篇的可以猛戳这里:underscore.js源码解析(一)
underscore.js源码
GitHub地址:
https://github.com/jashkenas/underscore/blob/master/underscore.js
本文解析的underscore.js版本是1.8.3
_.each
1 _.each = _.forEach = function(obj, iteratee, context) { 2 //optimizeCb( )是underscore内部用来执行函数的很重要的方法,这个我们后面再聊 3 iteratee = optimizeCb(iteratee, context); 4 var i, length; 5 if (isArrayLike(obj)) { 6 //数组 7 for (i = 0, length = obj.length; i < length; i++) { 8 iteratee(obj[i], i, obj); 9 }10 } else {11 //对象处理,这个_.keys( )我们也后面再聊12 var keys = _.keys(obj);13 for (i = 0, length = keys.length; i < length; i++) {14 iteratee(obj[keys[i]], keys[i], obj);15 }16 }17 return obj;18 };
在介绍_.matcher之前,需要先介绍一下createAssigner 和_.isMatch。
createAssigner
1 var createAssigner = function(keysFunc, defaults) { 2 return function(obj) { 3 var length = arguments.length; 4 //判断是否是对象 5 if (defaults) obj = Object(obj); 6 //如果一个参数或者对象为空,则返回这个对象 7 if (length < 2 || obj == null) return obj; 8 //从第二个参数开始 9 for (var index = 1; index < length; index++) {10 var source = arguments[index],11 //获取对应的keys12 //keysFunc只有keys和allKeys两种,在下面_.extend和_.extendOwn中可以看到13 keys = keysFunc(source),14 l = keys.length;15 //进行拷贝处理16 for (var i = 0; i < l; i++) {17 var key = keys[i];18 //defaults是为了对defaults做单独处理而添加的参数,具体的解释_.defaults里做详细分析19 //在_.extend和_.extendOwn中default没有传值所以是underfinded,所以下面判断条件横为true,正常进行拷贝处理20 if (!defaults || obj[key] === void 0) obj[key] = source[key];21 }22 }23 return obj;24 };25 };
_.matcher和_.matches
1 // 判断对象是否匹配attrs的属性2 _.matcher = _.matches = function(attrs) {3 //进行拷贝4 attrs = _.extendOwn({}, attrs);5 return function(obj) {6 //用来判断该属性是否在对象中,上文有提及7 return _.isMatch(obj, attrs);8 };9 };
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:underscore.js源码解析(二)
关键词:JS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。