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. 疯狂JAVA——第八章 java集合

    集合类主要负责保存.盛装其他数据,因此集合类也被称为容器类. 数组元素既可以是基本类型的值,也可以是对象(实际上是保存的对象的引用): 集合里只能保存对象.

  2. R及Rstuio下载及配置,及基本使用介绍

    1.R和Rstudio下载地址 https://cran.rstudio.com/a 2.Rstudio 的配置 外观.代码显示比例配置 选中tools 选中globle options 选中appe ...

  3. 读《asp.net MVC4开发指南(黄保翕编著)》笔记

    在刚刚过去的中秋节中,利用了两天的碎片时间把黄保翕编著的<asp.net MVC4 开发指南>看了遍,笔记如下,欢饮在开发MVC的同学一起来探讨: 1.社区 2.开源程序 3.易测试性 4 ...

  4. 通过Chrome的inspect对手机webview进行调试

    使用chrome的inspect可以对手机上的webview进行调试,因为真机没有什么比较好的调试工具,而chrome提供了这一个工具可以比较方便的查看真机上的元素,以及进行调试. 其实我对webvi ...

  5. java.lang.Error: Unresolved compilation problem: 解决方案

    严重: Allocate exception for servlet WX_Interfacejava.lang.Error: Unresolved compilation problem: The ...

  6. ubuntu的文本界面修改字体大小

    使用命令: dpkg-reconfigure console-setup

  7. INI

    .ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置,一般用户就用windows提供的各项图形化管理 ...

  8. iOS8 之后 tableview separatorInset cell分割线左对齐,ios7的方法失效了

    -(void)viewDidLayoutSubviews { if ([self.mytableview respondsToSelector:@selector(setSeparatorInset: ...

  9. python事件驱动的小例子

    首先我们写一个超级简单的web框架 event_list = [] #这个event_list中会存放所有要执行的类 def run(): for event in event_list: obj = ...

  10. 理解数据结构Priority Queue

    我们知道Queue是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在Queue中基于优先级处理对象.举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大 ...