今天剩下的大部分都是工具函数了,比较易读,就过一遍即可

// 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行相关推荐

  1. underscore.js源码研究(5)

    概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...

  2. underscore.js源码整体框架解析

    源码框架 读一些库的源码时最头疼的其实不是里面各个函数的功能,而是整体结构框架,通常库的源码都很长,跟框架相关的代码并不是在一起放着的,导致你想明白起来就很困难. 我看过通过画图的方式去讲解框架的,但 ...

  3. Underscore.js 入门教程

    出处:http://web.jobbole.com/87537/ 总结: Underscore.js 是一个由 Jeremy Ashkenas 开发的 JavaScript 库,它提供了许多作为开发者 ...

  4. Underscore.js 入门

    Underscore封装了常用的JavaScript对象操作方法,用于提高开发效率.它本身与我们介绍的主题"Backbone"没有半毛钱的关系,因此你可以完全不理会"Ba ...

  5. Underscore.js 初探

    一. 简介 Underscore 这个单词的意思是"下划线". Underscore.js 是一个 JavaScript 工具库,提供了一整套的辅助方法供你使用. Think th ...

  6. HTML怎么限制每行字数,JS实现每行固定字数,自动换行

    JS实现每行固定字数,自动换行 autoWrap.html 原码 .wrap_focus{border-width: 3px;border-style: solid;border-color:oran ...

  7. js 实现 table 行上移 (数据库)

    通过js实现表格行的上下移动,有两种情况: 1.只对显示层操作(即只针对页面的移动并不更新到数据库) 2.显示层的移动更新到数据库中 下面我分布就这两种方式的实现进行说明(我使用的是jquery ea ...

  8. Underscore.js常用方法介绍

    Underscore.js是一个很精干的库,压缩后只有4KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了JavaScript的编程.MVC框架Backbone.js就将这个库作为自 ...

  9. underscore.js 页面数据渲染

    1.underscore.js  源码 // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashken ...

  10. Underscore.js 的模板功能

    Underscore是一个非常实用的JavaScript库,提供许多编程时需要的功能的支持,他在不扩展任何JavaScript的原生对象的情况下提供很多实用的功能. 无论你写一段小的js代码,还是写一 ...

最新文章

  1. 孙立岩 python-basic: 用于学习python基础的课件(十一 十二)
  2. jsp中两个double相乘_图像处理中的代数运算及几何变换
  3. ubuntu下搭载LNMP环境,解决 fpm监听失败
  4. 《大话存储__网络存储系原理精解与最佳实践》电子书下载
  5. 基于JAVA+Servlet+JSP+MYSQL的学生宿舍卫生评分系统
  6. mysql study_mysql_study_3
  7. 2018农行软开广州笔试+面试经历
  8. Java HashMap底层原理解析
  9. 弹性系数和线径的计算公式_弹簧力的计算公式
  10. 数据库原理和应用(8)—— 数据类型
  11. SQL Sever创库
  12. 和数研究院4周年庆,初心不改,笃行致远!
  13. 强化学习环境学习-gym[atari]-paper中的相关设置
  14. python图像切割成多边形_python opencv在图像中裁剪任意形状多边形,裁剪镂空多边形, 裁剪多个多边形...
  15. 用户提交job后,abaqus的inp文件处理过程
  16. 数据结构——环形队列的原理(模拟环形队列)
  17. iOS二维码生成、识别、扫描等
  18. 了解Panda3D引擎的配置变量
  19. Web前端,CSS中盒子模型的组成,了解掌握盒子模型的边框、内边距、外边距
  20. 12306 抢票软件使用记录

热门文章

  1. 泰勒教授《哈佛幸福课》提及46本书籍
  2. 深度系统安装移动硬盘启动_教你用优启通U盘PE启动安装系统教程
  3. Gtk-Message: 14:47:21.541: Failed to load module “canberra-gtk-module“ 的处理方法
  4. mac怎么给移动硬盘分区
  5. 面试必备:零拷贝详解
  6. 沁恒CH348 USB转8串口芯片
  7. 《数学之美》读书笔记和知识点总结
  8. MSP430CPU介绍
  9. [LOL自走棋] 种族职业数据
  10. 人工智能粒子群优化和群智能