underscore.js 964 --- 1103行
今天剩下的大部分都是工具函数了,比较易读,就过一遍即可
// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString','propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];var collectNonEnumProps = function(obj, keys) {var nonEnumIdx = nonEnumerableProps.length;var constructor = obj.constructor;var proto = _.isFunction(constructor) && constructor.prototype || ObjProto;// Constructor is a special case.var prop = 'constructor';if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);while (nonEnumIdx--) {prop = nonEnumerableProps[nonEnumIdx];if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {keys.push(prop);}}};// Retrieve the names of an object's own properties.// Delegates to **ECMAScript 5**'s native `Object.keys`._.keys = function(obj) {if (!_.isObject(obj)) return [];if (nativeKeys) return nativeKeys(obj);var keys = [];for (var key in obj) if (_.has(obj, key)) keys.push(key);// Ahem, IE < 9.if (hasEnumBug) collectNonEnumProps(obj, keys);return keys;};// Retrieve all the property names of an object._.allKeys = function(obj) {if (!_.isObject(obj)) return [];var keys = [];for (var key in obj) keys.push(key);// Ahem, IE < 9.if (hasEnumBug) collectNonEnumProps(obj, keys);return keys;};// Retrieve the values of an object's properties._.values = function(obj) {var keys = _.keys(obj);var length = keys.length;var values = Array(length);for (var i = 0; i < length; i++) {values[i] = obj[keys[i]];}return values;};// Returns the results of applying the iteratee to each element of the object.// In contrast to _.map it returns an object._.mapObject = function(obj, iteratee, context) {iteratee = cb(iteratee, context);var keys = _.keys(obj),length = keys.length,results = {};for (var index = 0; index < length; index++) {var currentKey = keys[index];results[currentKey] = iteratee(obj[currentKey], currentKey, obj);}return results;};// Convert an object into a list of `[key, value]` pairs.// The opposite of _.object._.pairs = function(obj) {var keys = _.keys(obj);var length = keys.length;var pairs = Array(length);for (var i = 0; i < length; i++) {pairs[i] = [keys[i], obj[keys[i]]];}return pairs;};// Invert the keys and values of an object. The values must be serializable._.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;};// Return a sorted list of the function names available on the object.// Aliased as `methods`._.functions = _.methods = function(obj) {var names = [];for (var key in obj) {if (_.isFunction(obj[key])) names.push(key);}return names.sort();};// An internal function for creating assigner functions.var createAssigner = function(keysFunc, defaults) {return function(obj) {var length = arguments.length;if (defaults) obj = Object(obj);if (length < 2 || obj == null) return obj;for (var index = 1; index < length; index++) {var source = arguments[index],keys = keysFunc(source),l = keys.length;for (var i = 0; i < l; i++) {var key = keys[i];if (!defaults || obj[key] === void 0) obj[key] = source[key];}}return obj;};};// Extend a given object with all the properties in passed-in object(s)._.extend = createAssigner(_.allKeys);
collectNonEnumProps
// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); // 是否存在小于ie9的无法for in的bugvar nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString','propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; var collectNonEnumProps = function(obj, keys) {var nonEnumIdx = nonEnumerableProps.length;var constructor = obj.constructor;var proto = _.isFunction(constructor) && constructor.prototype || ObjProto;// Constructor is a special case.var prop = 'constructor';if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);while (nonEnumIdx--) {prop = nonEnumerableProps[nonEnumIdx];if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {keys.push(prop);}}};
收集对象中无法迭代的属性
_.keys
// Retrieve the names of an object's own properties.// Delegates to **ECMAScript 5**'s native `Object.keys`._.keys = function(obj) {if (!_.isObject(obj)) return []; // 如果非对象,返回空数组if (nativeKeys) return nativeKeys(obj); // object.keysvar keys = []; for (var key in obj) if (_.has(obj, key)) keys.push(key); // 原生属性迭代,非prototype// Ahem, IE < 9.if (hasEnumBug) collectNonEnumProps(obj, keys);return keys; };// Retrieve all the property names of an object._.allKeys = function(obj) {if (!_.isObject(obj)) return [];var keys = [];for (var key in obj) keys.push(key);// Ahem, IE < 9.if (hasEnumBug) collectNonEnumProps(obj, keys);return keys;}; //包含prototype
_.values
// Retrieve the values of an object's properties._.values = function(obj) {var keys = _.keys(obj);var length = keys.length;var values = Array(length);for (var i = 0; i < length; i++) {values[i] = obj[keys[i]];}return values;};
收集value,且是原生
_.mapObject
// Returns the results of applying the iteratee to each element of the object.// In contrast to _.map it returns an object._.mapObject = function(obj, iteratee, context) {iteratee = cb(iteratee, context);var keys = _.keys(obj),length = keys.length,results = {};for (var index = 0; index < length; index++) {var currentKey = keys[index];results[currentKey] = iteratee(obj[currentKey], currentKey, obj);}return results;};
已解释
_.pairs
// Convert an object into a list of `[key, value]` pairs.// The opposite of _.object._.pairs = function(obj) {var keys = _.keys(obj); // 取得原生keyvar length = keys.length;var pairs = Array(length);for (var i = 0; i < length; i++) {pairs[i] = [keys[i], obj[keys[i]]];}return pairs;};
_.invert
// Invert the keys and values of an object. The values must be serializable._.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;};
翻转
_.functions
// Return a sorted list of the function names available on the object.// Aliased as `methods`._.functions = _.methods = function(obj) {var names = [];for (var key in obj) {if (_.isFunction(obj[key])) names.push(key);}return names.sort();};
prototype的方法也会涉及
_.extend
// An internal function for creating assigner functions.var createAssigner = function(keysFunc, defaults) {return function(obj) {var length = arguments.length;if (defaults) obj = Object(obj);if (length < 2 || obj == null) return obj;for (var index = 1; index < length; index++) {var source = arguments[index], keys = keysFunc(source),l = keys.length;for (var i = 0; i < l; i++) {var key = keys[i];if (!defaults || obj[key] === void 0) obj[key] = source[key];}} // 拓展属性,如果设定default,则就按照原属性写入return obj;};};// Extend a given object with all the properties in passed-in object(s)._.extend = createAssigner(_.allKeys); // 区别在于一个覆写所有_.extendOwn = _.assign = createAssigner(_.keys);// 一个覆写原生
_.findKey
// Returns the first key on an object that passes a predicate test._.findKey = function(obj, predicate, context) {predicate = cb(predicate, context);var keys = _.keys(obj), key;for (var i = 0, length = keys.length; i < length; i++) {key = keys[i];if (predicate(obj[key], key, obj)) return key;}};
找到符合条件的key就跑路,返回key,正所谓跑得快
没了
underscore.js 964 --- 1103行相关推荐
- underscore.js源码研究(5)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- underscore.js源码整体框架解析
源码框架 读一些库的源码时最头疼的其实不是里面各个函数的功能,而是整体结构框架,通常库的源码都很长,跟框架相关的代码并不是在一起放着的,导致你想明白起来就很困难. 我看过通过画图的方式去讲解框架的,但 ...
- Underscore.js 入门教程
出处:http://web.jobbole.com/87537/ 总结: Underscore.js 是一个由 Jeremy Ashkenas 开发的 JavaScript 库,它提供了许多作为开发者 ...
- Underscore.js 入门
Underscore封装了常用的JavaScript对象操作方法,用于提高开发效率.它本身与我们介绍的主题"Backbone"没有半毛钱的关系,因此你可以完全不理会"Ba ...
- Underscore.js 初探
一. 简介 Underscore 这个单词的意思是"下划线". Underscore.js 是一个 JavaScript 工具库,提供了一整套的辅助方法供你使用. Think th ...
- HTML怎么限制每行字数,JS实现每行固定字数,自动换行
JS实现每行固定字数,自动换行 autoWrap.html 原码 .wrap_focus{border-width: 3px;border-style: solid;border-color:oran ...
- js 实现 table 行上移 (数据库)
通过js实现表格行的上下移动,有两种情况: 1.只对显示层操作(即只针对页面的移动并不更新到数据库) 2.显示层的移动更新到数据库中 下面我分布就这两种方式的实现进行说明(我使用的是jquery ea ...
- Underscore.js常用方法介绍
Underscore.js是一个很精干的库,压缩后只有4KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了JavaScript的编程.MVC框架Backbone.js就将这个库作为自 ...
- underscore.js 页面数据渲染
1.underscore.js 源码 // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashken ...
- Underscore.js 的模板功能
Underscore是一个非常实用的JavaScript库,提供许多编程时需要的功能的支持,他在不扩展任何JavaScript的原生对象的情况下提供很多实用的功能. 无论你写一段小的js代码,还是写一 ...
最新文章
- 孙立岩 python-basic: 用于学习python基础的课件(十一 十二)
- jsp中两个double相乘_图像处理中的代数运算及几何变换
- ubuntu下搭载LNMP环境,解决 fpm监听失败
- 《大话存储__网络存储系原理精解与最佳实践》电子书下载
- 基于JAVA+Servlet+JSP+MYSQL的学生宿舍卫生评分系统
- mysql study_mysql_study_3
- 2018农行软开广州笔试+面试经历
- Java HashMap底层原理解析
- 弹性系数和线径的计算公式_弹簧力的计算公式
- 数据库原理和应用(8)—— 数据类型
- SQL Sever创库
- 和数研究院4周年庆,初心不改,笃行致远!
- 强化学习环境学习-gym[atari]-paper中的相关设置
- python图像切割成多边形_python opencv在图像中裁剪任意形状多边形,裁剪镂空多边形, 裁剪多个多边形...
- 用户提交job后,abaqus的inp文件处理过程
- 数据结构——环形队列的原理(模拟环形队列)
- iOS二维码生成、识别、扫描等
- 了解Panda3D引擎的配置变量
- Web前端,CSS中盒子模型的组成,了解掌握盒子模型的边框、内边距、外边距
- 12306 抢票软件使用记录
热门文章
- 泰勒教授《哈佛幸福课》提及46本书籍
- 深度系统安装移动硬盘启动_教你用优启通U盘PE启动安装系统教程
- Gtk-Message: 14:47:21.541: Failed to load module “canberra-gtk-module“ 的处理方法
- mac怎么给移动硬盘分区
- 面试必备:零拷贝详解
- 沁恒CH348 USB转8串口芯片
- 《数学之美》读书笔记和知识点总结
- MSP430CPU介绍
- [LOL自走棋] 种族职业数据
- 人工智能粒子群优化和群智能