isPlainObject方法

测试对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的)

示例:

//测试是否为纯粹的对象
jQuery 代码:
jQuery.isPlainObject({}) // true
jQuery.isPlainObject("test") // false

源码分析:

isPlainObject: function( obj ) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}

接受一个待检测的对象,首先列出了几个不满足的条件

1.obj能转换为false

2.不是object类型

3.是dom对象

4.是window对象

如果以上条件任意一条成立返回false

try {
// Not own constructor property must be Object
if ( obj.constructor &&
!hasOwn.call(obj, "constructor") &&
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}

由于ie会8,9在处理特定宿主对象的时候会报错所以采用了try语句,如果走到这里说明参数obj一定是对象类型,但此时的对象类型有可能是自定义构造函数创建的,所以有必要进行过滤,如果以下条件都满足则表示为自定义构造函数创建的

1.有constructor属性    到现在为止我都没有搞清楚这句话什么意思,无论以哪种方式创建对象都是有constructor属性的如果你看到了这里希望给我一个合理的解释谢谢

2.参数的属性constrctor是非继承属性    正常情况下,这个属性存放于构造函数的原型对象中是继承属性,如果不是说明在构造函数里面手动指定了

3.如果参数的构造函数里面没有非继承属性isPrototypeOf说明是自定义的构造函数创建的,为了更好的理解这一段条件下面做一些代码测试:

 function Person(){};
Person.prototype={
constructor:Person
}
var obj=new Person();
alert(!!obj.constructor);
alert(!obj.hasOwnProperty('constructor'));
alert(!obj.constructor.prototype.hasOwnProperty('isPrototypeOf'));

既然是过滤自定义构造函数的那就用用自定义的检测一下,执行结果

true

true

true

果然是3个都满足,这样会顺利返回false,下面采用new Object方式

var obj=new Object();

运行结果如下

true

true

false

由于第3个结果为false所以不会返回false似乎也是正确的,下面采用字面量方式创建对象

var obj={};

运行结果跟new关键字创建是一样的看到结果令我很困惑的事情出现了,第一个条件和第二个条件有何用?都是返回ture只有第三个条件在起作用不是吗?参考《技术内幕》书中对第一个判断的解释是:”如果对象obj没有属性constructor,则说明该对象是通过对象字面量{}创建的”,对象字面量创建的对象没有constructor属性?肯定是有的啊,再说了即使可以判断但没有意思啊,字面量对象不在过滤范围内啊,笔者很困惑希望大家给予评论解惑感激不尽。

// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own. var key;
for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key );

for...in循环中先循环的是非继承属性然后是继承属性,当然非继承属性的propertyIsEnumerable必须为true利用这个原理如果最后被循环的属性是继承属性那就返回false,如果最后一个是非继承属性那就肯定全是非继承属性返回true

最后附上完整源码:

    isPlainObject: function( obj ) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
} try {
// Not own constructor property must be Object
if ( obj.constructor &&
!hasOwn.call(obj, "constructor") &&
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
} // Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own. var key;
for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key );
},

isEmptyObject方法

测试对象是否是空对象(不包含任何属性)。

示例:

//测试是否为空对象
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

源码分析:

isEmptyObject: function( obj ) {
for ( var name in obj ) {
return false;
}
return true;
},

只要for循环执行了,说明obj不是空的否则返回true,这种判断很简单没有判断参数是否是对象的情况下就直接循环了,你甚至可以用它来判断是否是空字符串

var str='str';
var empty='';
alert($.isEmptyObject(str)); //false
alert($.isEmptyObject(empty)); //true

jQuery静态方法isPlainObject,isEmptyObject方法使用和源码分析的更多相关文章

  1. jQuery静态方法inArray,grep,merge,makeArray方法使用和源码分析

    inArray方法 确定第一个参数在数组中的位置,从0开始计数(如果没有找到则返回 -1 ). 示例: var arr = [ 4, "Pete", 8, "John&q ...

  2. jQuery静态方法parseJSON方法使用和源码分析

    该方法接受一个JSON字符串,返回解析后的对象. 传入一个畸形的JSON字符串会抛出一个异常.比如下面的都是畸形的JSON字符串: {test: 1} ( test 没有包围双引号) {'test': ...

  3. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  4. jQuery 2.1.4版本的源码分析

    jQuery 2.1.4版本的源码分析 jquery中获取元素的源码分析 jQuery.each({// 获取当前元素的父级元素 parent: function(elem) { var parent ...

  5. Android Debuggerd 简要介绍和源码分析(转载)

    转载: http://dylangao.com/2014/05/16/android-debuggerd-%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D%E5%92%8C%E ...

  6. Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析

    相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...

  7. Kubernetes Job Controller 原理和源码分析(二)

    概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...

  8. Kubernetes Job Controller 原理和源码分析(三)

    概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...

  9. Kubernetes Job Controller 原理和源码分析(一)

    概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...

随机推荐

  1. KnockoutJS 3.X API 第七章 其他技术(8) 异步错误处理

    注意:本文档适用于Knockout 3.4.0及更高版本. ko.onError Knockout包装内部异步调用,并在抛出原始错误之前查找可选的ko.onError回调以执行(如果遇到异常). 这使 ...

  2. Execute Sql Task 的Result DataSet如何返回

    Execute Sql Task的Result DataSet 主要有以下四种,当Execute Sql Task返回结果之后,需要使用SSIS Variable 来接收数据. 例子中使用的数据表代码 ...

  3. [汇编与C语言关系]3. 变量的存储布局

    以下面C程序为例: #include <stdio.h> ; ; ; int c; int main(void) { ; char b[] = "Hello World" ...

  4. MyEclipse 2014跟2015破解

    最近一直在弄后台开发,之前用idea感觉用的很不习惯,于是就换了myeclipse,两年多没有用myeclipse了,版本都很高了,记得我们之前用myeclipse8.5版本的时候,注册码什么的直接运 ...

  5. android5.0联系人 sort_key改成phonebook_label

    项目中用到了联系人根据字母排序,在android4.0手机上是可以的,但是在android4.4以上的手机排序是乱的,一般字母排序都是根据sort_key这个拼音进行排序,而android5.0这个字 ...

  6. C#:根据银行卡卡号判断银行名称

    原文地址:android 根据银行卡卡号判断银行 原文是 java ,现在将它翻译成 C# ,并对代码重新编排整理,博主是一个今年刚出来的应届毕业生,不足之处请多多包涵. 根据银行卡号判断所属银行,依 ...

  7. 如何用Excel直接查询Oracle中的数据

    将Oracle中查询的数据保存为Excel文件,通常使用的是PL/SQL Developer. 其实,Excel可直接写SQL语句查询Oracle中数据,在这里,用到ODBC驱动.详细步骤如下: 一. ...

  8. html规范

    1 前言 HTML 作为描述网页结构的超文本标记语言,在百度一直有着广泛的应用.本文档的目标是使 HTML 代码风格保持一致,容易被理解和被维护. 2 代码风格 2.1 缩进与换行 [强制] 使用 4 ...

  9. swift2.0 如何隐藏和设置状态栏

    1.在ViewController中操作当前ViewController的状态栏/** 隐藏状态栏 */ override func prefersStatusBarHidden() -> Bo ...

  10. 相克军_Oracle体系_随堂笔记006-日志原理

    简单来说,学习Oracle数据库就两个目标: 保证数据库数据的一致性: 提高数据库的性能(这个和日志没关系).   日志的功能:     只是保证数据库数据的一致性:   1.Oracle日志原理   ...