=============== 通知:

博主已迁至《掘金》码字,博客园可能以后不再更新,掘金地址:https://juejin.im/post/5a1a6a6551882534af25a86b  请多多关照!!

-------------------在此谢过!-----------

今天来解析一下underscore这个工具框架,现在虽然使用的人比较少,但这个小工具还是比较适合入门级的同学们来研究的!

我看的是1.8.3版本

一、判断是否是对象    _.isObject()

 这里所说的对象 包括function 和object
源码:
   _.isObject = function(obj) {
   var type = typeof obj;
   return type === 'function' || type === 'object' && !!obj;
  };
解析:
先用typeof进行判断,将判断结果做判断,如果结果等于function 或者判断结果类型为object 并且为真值 (!!意为强制转布尔值true/false)
调用:
var obj={a:1,b:2};
var str="abcd";
var arr=[1,2,3] _.isObject(obj) => true;
_.isObject(str) =>false;
_.isObject(arr) =>true;

二、判断是否是Array     _.isArray()

源码:
    var nativeIsArray  = Array.isArray
   _.isArray = nativeIsArray || function(obj) {  
  return toString.call(obj) === '[object Array]';  
 };
解析:

 Array.isArray是js自带的array判断方法,先用原生的方法判断一次,如果原生方法不存在,再用toStringe.call()方法判断,如果为真值,则是数组,否则不是
调用:

var arr=[1,2,3];

var arr2='2132132'

var arr3={a:1,b:2}
console.log(_.isArray(arr),_.isArray(arr2),_.isArray(arr3))     =》true,false,false
 

三、判断是否为Boolean 类型 _.isBoolean()

源码:
  _.isBoolean = function(obj) {
   return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
  };
解析:
先判断传入值是否可以直接转成true或false,如果不可以,再使用toString()判断结果是不是布尔
调用:
console.log(_.isBoolean(true)) =>true;
console.log(_.isBoolean(13)) =>false;

四、判断是否是undefined    _.isUndefined()

源码:
  _.isUndefined = function(obj) {
  return obj === void 0;
  };
解析:
undefined 并不等于undefined,而void 0 的返回结果一直都会是undefined ,所以作者使用它进行判断
调用:
console.log( _.isNull(undefined)) =>true
console.log( _.isUndefined(void 0)) =>true
当前传入undefined 和 void 0 结果为true 其他为false

五、判断类型   toString.call()

通过判断toString.call(参数)来根据结果来判断是哪种类型,以上的几个判断类型的多是沿用这个方法而来;
调用:
  toString.call("123") => "[object String]" 字符串   toString.call(123) => "[object Number]" 数字   toString.call(null) => "[object Null]" null   toString.call({a:1}) => "[object Object]" 对象   toString.call([1,5,8]) => "[object Array]" 数组   toString.call(true) => "[object Boolean]" 布尔   toString.call(/a/g) => "[object RegExp]" 正则   toString.call(undefined) => "[object undefined]" undefined   toString.call(new Date()) => "[object Date]" 日期对象 解析:
这种判断使用的是Object.prototype上的原生toString()方法判断数据类型

六、判断key是否存在于obj中 _.has()

-------------------------------------------------------------------

源码:
  _.has = function(obj, key) {
   return obj != null && hasOwnProperty.call(obj, key);
  }; 解析:
先判断obj是否为null,并且调用hasOwnProperty的方法检测key 是否存在于obj

判断key值是否存在于obj中,用于对象中的判断,还可通过此方法检查其是不是同一个原型

调用:
var obj={a:1,b:2};
     console.log(_.has(obj,"a")) =>true
console.log(_.has(obj,"c")) =>false

七、通过属性和对象返回属性值  _.property(key)(obj)  ;  _.propertyOf(obj)(key);

这两个方法都是可以返回当前obj的key对应的值

_.property(key)(obj)

源码: 
 _.property = function(key) {
   return function(obj) {
   return obj == null ? void 0 : obj[key];
   };
  };
解析:
当前方法传入两个值 一个是obj 一个是key 先判断Obj是否是存在,是不是null,如果是 返回undefined 如果不是返回当前obje的key的值
调用:
  var obj={
   a:111,
   b:222
  };
   console.log(_.property("a")(obj)); =>111

----- _.propertyOf(obj)(key);------------------------------------------------------------------------------------------

源码:
  _.propertyOf = function(obj) {
   return obj == null ? function(){} : function(key) {
   return obj[key];
   };
  };
解析:
和上一个方法大同小异,当前判断obj是否是null,如果是返回一个空函数,如果不是拿到key,去obj的key上去匹配
调用:
   var obj={
   a:111,
   b:222
   };     console.log(_.property("a")(obj));  =>111

八、生成min,max之间的随机数

下面我们先来温习一下math()的方法吧!

     四舍五入:
            Math.round(2.1)  =>2
 
     向下取整:
             Math.floor(5.8)  =>5
 
     向上取整:
             Math.ceil(3.2)   =>4
 
     生成0-1之间随机数:
                Math.random()
源码:
  _.random = function(min, max) {
     if (max == null) {
     max = min;
     min = 0;
     }
     return min + Math.floor(Math.random() * (max - min + 1));
  };
 
调用:
console.log(_.random(2,9)) =>生成一个随机整数

解析:

   当前方法传入两个值,在方法内判断第二个值是否为空,如果没有将max的值,就将min赋给max作为最大值,min则赋值为0, 
如果没有上面的情况,直接进行下面的方法
(Math.random()*(max-min+1))== 当前函数生成0到 (max-min+1))之间的数 但并不是我们想要的 例如 : let min = 5; let max=10; 那么执行完上面第一步 我们得到的时候0-6之间的数字
      Math.floor的方法将得到的值向下取整,如果是4.8,那就拿到4,

       最后一步  min+4 将最小值与拿到的值合并 那么我们拿到了9,正是我们想要的

       这个方法会生成min和max之间的整数 (包含max和min)
九、判断是否是DOM 元素
 源码:
  _.isElement = function(obj) {
   return !!(obj && obj.nodeType === 1);
   }; 解析:
先确定是否传入了值,并且判断元素的nodeType的类型是否为1,然后用!!强制转布尔值
十、判断是否在最大值和最小值之间

    _.isFinite = function(obj) {
return isFinite(obj) && !isNaN(parseFloat(obj));
};

这里面的这个方法,其实现在单用isFinite()就可以判断出来,

判断是否是一个有限的数字,即值在:
console.log(Number.MAX_VALUE); 最大值
console.log(Number.MIN_VALUE); 最小值
之间的,如果是返回true,如果是加“”的数字还可自动转换,输入最后结果
调用:
_.isFinite( "888")  => true
 _.isFinite( "aaa")  => false


十一、获取当前时间的时间戳(关于时间的各种方法我会单独出一篇,敬请期待)

    _.now = Date.now || function() {
return new Date().getTime();
};

    调用:
console.log(_.now()) => 1499913487397 等同于:
  console.log(Date.now());
  console.log(new Date().getTime())

underscore 工具的更多相关文章

  1. javascript - Underscore 与 函数式编程

    <Javascript函数式编程 PDF> # csdn下载地址http://download.csdn.net/detail/tssxm/9713727 Underscore # git ...

  2. 2017年当下最值得你关注的前端开发框架,不知道你就OUT了!

    近几年随着 jQuery.Ext 以及 CSS3 的发展,以 Bootstrap 为代表的前端开发框架如雨后春笋般挤入视野,可谓应接不暇. 在这篇分享中,我将总结2017年当下最值得你关注的前端开发框 ...

  3. 使用nodegrass简单封装http请求例子

    1.项目中经常性的使用http发送请求处理数据.而大部分请求方式为get和post,于是对http请求进行封装,提供代码的利用率. 2.nodegress是nodejs的一个请求工具. 具体步骤及代码 ...

  4. 【总结】2017年当下最值得你关注的前端开发框架,不知道你就OUT了!

    近几年随着 jQuery.Ext 以及 CSS3 的发展,以 Bootstrap 为代表的前端开发框架如雨后春笋般挤入视野,可谓应接不暇. 在这篇分享中,我将总结2017年当下最值得你关注的前端开发框 ...

  5. Backbone vs AngularJS

    首先 Backbone 没有 AngularJS 那么容易上手. 而且作者并没有想让Backbone草根化的意思. Backbone 比喻成战斗机. 看上去更像是真正的MVC框架, model-vie ...

  6. 【跟着子迟品 underscore】常用类型判断以及一些有用的工具方法

    Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...

  7. Lo-Dash – 替代 Underscore 的优秀 JS 工具库

    前端开发人员大都喜欢 Underscore,它的工具函数很实用,用法简单.这里给大家推荐另外一个功能更全面的 JavaScript 工具——Lo-Dash,帮助你更好的开发网站和 Web 应用程序. ...

  8. Underscore.js 常用类型判断以及一些有用的工具方法

    1. 常用类型判断以及一些有用的工具方法 underscore.js 中一些 JavaScript 常用类型检查方法,以及一些工具类的判断方法. 首先我们先来谈一谈数组类型的判断.先贴出我自己封装好的 ...

  9. Underscore.js工具库

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象. 他解决了这个问题:“如果我面对一个空白的 HTML ...

随机推荐

  1. 【原】无脑操作:Webstorm集成Git/Github

    Webstorm作为前端开发的主流工具,对Git及Github可以非常简便的集成. 1.开发环境:(如何安装就不说了) ① Webstorm 2018 ② git version 2.20.1 ③ G ...

  2. 屏蔽打开文件时提示“您尝试打开的文件xxx.xls的格式与文件扩展名指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文 件?”

    修改注册表解决 1.打开注册表编辑器 方法:开始 -> 运行 -> 输入regedit -> 确定 2.找到注册表子项 HKEY_CURRENT_USER\Software\Micr ...

  3. kali无法安装nvidia显卡驱动

    按照各位大神的博客安装nvidia显卡驱动一直失败,重启之后无法正常进入系统,恢复模式可以进入,一直以为自己是不是哪里步骤不对,后面来回重装了几次系统. 最后意识到虚拟机里用的是虚拟网卡,并非宿主机的 ...

  4. docker 学习操作记录 5-1

    记录5-1 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+A ...

  5. Union 与 Union All 区别(抄的W3C School的,抄一遍就记住了!)

    Union ,UnionAll 俩都是用来合并两个或以上的查询结果集: Union操作符 :select语句中必须有相同的数列 (相等数量的列,不同结果集同一列的数据类型一致,列的顺序必须相同): u ...

  6. Excel 简单使用

    1.Excel复制上一行 注意鼠标的样子 2.删除多行 删除之后如图所示: 删除多列也是同样的操作 3.日期格式不能按照数据库的形式进行输入 数字的位数太多输入之后改变了数字,可以设置为文本格式,进行 ...

  7. Python time strptime() 函数根据指定的格式把一个时间字符串解析为时间元组

    Python time strptime() 函数根据指定的格式把一个时间字符串解析为时间元组 import time dt=time.strptime('2019-08-08 11:32:23', ...

  8. AntDesign vue学习笔记(七)Form 读写与图片上传

    AntDesign Form使用布局相比传统Jquery有点繁琐 (一)先读写一个简单的input为例 <a-form :form="form" layout="v ...

  9. 【C语言学习笔记】指针

    用来存放一个变量地址的变量就叫指针变量.指针变量也是有类型约束的,一般什么类型的指针指向什么类型的变量. 指针之所以叫变量,是因为它里面所存放的变量的地址也是不断变化的,指针是可以移动的. 定义格式: ...

  10. 搭建zipkin并以mysql的方式存储数据

    zipkin以mysql的方式存储 (centos+java8+mysql+zipkin2.3.1) 前言: 这篇教程用于搭建已mysql作为存储的zipkin.(还不知道zipkin是什么的小伙伴请 ...