1、_.keys():获取对象的属性名,不包含原型链

_.keys = nativeKeys || function(obj) {
if (obj !== Object(obj)) throw new TypeError('Invalid object');
var keys = [];
//都是用自增函数
for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
return keys;
};

2、_.values():返回对象的值,不包含原型链的值

_.values = function(obj) {
//对函数执行_.identity,并返回数组
return _.map(obj, _.identity);
};

3、_.functions():返回对象所有的方法名

_.functions = _.methods = function(obj) {
var names = [];
for (var key in obj) {
if (_.isFunction(obj[key])) names.push(key);
}
return names.sort();
};

4、_.extend():复制source对象中的所有属性覆盖到destination对象上,并且返回 destination 对象. 复制是按顺序的

_.extend = function(obj) {
//会传入多个source
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
obj[prop] = source[prop];
}
});
return obj;
};

5、_.pick():过滤obj,返回指定key的对象

_.pick = function(obj) {
var result = {};
each(_.flatten(slice.call(arguments, 1)), function(key) {
if (key in obj) result[key] = obj[key];
});
return result;
};

6、_.defaults():用defaults对象填充object中undefined属性。并且返回这个object。

_.defaults = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
if (obj[prop] == null) obj[prop] = source[prop];
}
});
return obj;
};

7、_.clone():浅复制object,

_.clone = function(obj) {
if (!_.isObject(obj)) return obj;
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};

7、_.tap(object, interceptor):用 object作为参数来调用函数interceptor,然后返回object。链式调用时很有用

实例
_.chain([1,2,3,200])
.filter(function(num) { return num % 2 == 0; })
.tap(alert)
.map(function(num) { return num * num })
.value();
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};

8、eq():比较两个数据的值,是否相等

9、_.isEqual(); 内部函数eq的外部用法

_.isEqual = function(a, b) {
return eq(a, b, []);
};

10、_.isEmpty():测验:'', false, 0, null, undefined, NaN, [], {}

_.isEmpty = function(obj) {
   //null, undefined
if (obj == null) return true;
   //'',[]
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
for (var key in obj) if (_.has(obj, key)) return false;
   //false,0,NaN
return true;
};

11、_.isElement():验证对象是否是一个DOM对象

    _.isElement = function(obj) {
     //为什么要写!!
return !!(obj && obj.nodeType == 1);
};

12、_.isArray():验证对象是否是一个数组类型, 优先调用宿主环境提供的isArray方法;isFunction;isString;isNumber,isDate,isRegExp;同样

    _.isArray = nativeIsArray ||
function(obj) {
return toString.call(obj) == '[object Array]';
};

13、_.isObject():证对象是否是一个复合数据类型的对象(即非基本数据类型String, Boolean, Number, null, undefined)

如果基本数据类型通过new进行创建, 则也属于对象类型

    _.isObject = function(obj) {
return obj === Object(obj);
};

14、_.isArguments():检查一个数据是否是一个arguments参数对象

    _.isArguments = function(obj) {
return toString.call(obj) == '[object Arguments]';
};
// 验证isArguments函数, 如果运行环境无法正常验证arguments类型的数据, 则重新定义isArguments方法
//还可以这样...
if(!_.isArguments(arguments)) {
// 对于环境无法通过toString验证arguments类型的, 则通过调用arguments独有的callee方法来进行验证
_.isArguments = function(obj) {
// callee是arguments的一个属性, 指向对arguments所属函数自身的引用
       //有这个属性,就是arguments
return !!(obj && _.has(obj, 'callee'));
};
}

15、_.isFunction():判断是否为函数

_.isFunction = function(obj) {
return toString.call(obj) == '[object Function]';
};

16、_.isString():验证对象是否是一个字符串类型

_.isString = function(obj) {
return toString.call(obj) == '[object String]';
};

17、_.isNumber():验证对象是否是一个数字类型

_.isNumber = function(obj) {
return toString.call(obj) == '[object Number]';
};

18_.isFinite(): 检查一个数字是否为有效数字且有效范围(Number类型, 值在负无穷大 - 正无穷大之间)

_.isFinite = function(obj) {
     //isFinite()是window函数
return _.isNumber(obj) && isFinite(obj);
};

19、_.isNaN(): 检查数据是否为NaN类型(所有数据中只有NaN与NaN不相等)

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

20、 _.isBoolean():检查数据是否为Boolean类型

    _.isBoolean = function(obj) {
// 支持字面量和对象形式的Boolean数据
return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
};

21、_.isDate():检查数据是否是一个Date类型

_.isDate = function(obj) {
return toString.call(obj) == '[object Date]';
};

22、_.isRegExp():检查数据是否是一个正则表达式类型

_.isRegExp = function(obj) {
return toString.call(obj) == '[object RegExp]';
};

23、_.isNull():检查数据是否为null

 _.isNull = function(obj) {
return obj === null;
};

24、_.isUndefined():检查数据是否是Undefined(未定义的)值

    _.isUndefined = function(obj) {
return obj === void 0;
};

25、_.has():对象本身是否包含指定的属性,不检查原型链,是hasOwnProperty的安全封装

_.has = function(obj, key) {
   //其实这种不安全,后面的版本会改进
return hasOwnProperty.call(obj, key);
};

  

underscore objects的更多相关文章

  1. Object Pascal中文手册 经典教程

    Object Pascal 参考手册 (Ver 0.1)ezdelphi@hotmail.com OverviewOverview(概述)Using object pascal(使用 object p ...

  2. (三)underscore.js框架Objects类API学习

    keys_.keys(object)  Retrieve all the names of the object's properties. _.keys({one: 1, two: 2, three ...

  3. JavaScript 特殊对象 Array-Like Objects 详解

    这篇文章拖了有两周,今天来跟大家聊聊 JavaScript 中一类特殊的对象 -> Array-Like Objects. (本文节选自 underscore 源码解读系列文章,完整版请关注 h ...

  4. 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG

    这篇文章并不在我的 underscore 源码解读计划中,直到 @pod4g 同学回复了我的 issue(详见 https://github.com/hanzichi/underscore-analy ...

  5. 【跟着子迟品 underscore】Object Functions 相关源码拾遗 & 小结

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

  6. 【跟着子迟品 underscore】JavaScript 中如何判断两个元素是否 "相同"

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

  7. 你可能不再需要Underscore

    过去几年像 Underscore 和 lodash 等库进入许多JavaScript程序员的工具函数中.虽然这些工具库可以使你的代码写起来更容易,但是他们不一定使代码更简单或更容易理解. 各种工具函数 ...

  8. Underscore.js 初探

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

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

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

随机推荐

  1. go递归函数如何传递数组切片slice

    数组切片slice这个东西看起来很美好,真正用起来会发现有诸多的不爽. 第一,数组.数组切片混淆不清,使用方式完全一样,有时候一些特性又完全不一样,搞不清原理很容易误使用. 第二,数组切片的appen ...

  2. etcd ui

    https://github.com/henszey/etcd-browser docker build --build-arg http_proxy=http://109.105.4.17:3128 ...

  3. mysql 数值与字符类型 长度梳理

    上述表格中的数值类型都是定长的,也就是说,无论你存的数值是多少,多大或者多小,占用的存储字节大小都是固定的.例如,设置int(1),虽然M值是1个字符,但是它所占用的空间大小永远都是4个字节的大小,换 ...

  4. 大型运输行业实战_day02_1_数据库设计与powerDesigner使用

    1.安装powerDesigner 1. 傻瓜式的安装 2.在安装的过程中选择地区后才可以点击同意和下一步 3.安装地址,建议直接把c改为d 4.其他选项直接下一步 2.使用powerDesigner ...

  5. webpack 常用插件及作用

    copy-webpack-plugin :复制文件到目标文件夹.在开发时使用热模替换,(没有生成dist 文件夹,都在内存中),如果想引用某一个js文件,直接写script标签是找不到的,因为服务器内 ...

  6. LibreOJ 6277 数列分块入门 1(分块)

    题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...

  7. EF6.0新特性-DbCommandInterceptor实现非SQL端读写分离

    前几天看了一个基于sqlserver的负载均衡与读写分离的软件Moebius,实现的方式还是不错的,这使得用sqlserver数据库的同学时有机会对数据库进行更有效的优化了

  8. npm 如何设置镜像站为淘宝网

    转载 2015年06月24日 17:12:12 10542 淘宝镜像:http://npm.taobao.org/ 镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候 ...

  9. c++11多线程学习笔记之三 condition_variable使用

    从windows角度来说,condition_variable类似event. 阻塞等待出发,不过condition_variable可以批量出发. 代码如下: // 1111111.cpp : 定义 ...

  10. Tomcat的杂七杂八

    localhost_access_log.2016-01-15.txt  原来这里面有访问记录. /logs/catalina.2016-01-22.log 这里有显示失败的信息 2016-01-23 ...