详解jQuery中的isPlainObject()使用方法


Posted in jQuery onFebruary 27, 2018

说明

jQuery中的isPlainObject() 函数用于判断指定参数是否是一个纯粹的对象,返回值为Boolean类型。

"纯粹的对象",就是通过 { }、new Object()、Object.create(null) 创建的对象。

这个方法的作用是为了跟其他的 JavaScript对象如 null,数组,宿主对象(documents),DOM 等作区分,因为这些用 typeof 都会返回object。

使用

语法:

$.isPlainObject( object )

参数说明:

object:任意类型 需要进行判断的任意值。

$.isPlainObject({});  //true
$.isPlainObject(new Object);  //true
$.isPlainObject(Object.create(null));  //true
$.isPlainObject([]);  //false
$.isPlainObject(document);  //false

源码分析

我们来看看jQuery 3.3.1 版本下的源码:https://github.com/jquery/jquery/blob/ac9e3016645078e1e42120822cfb2076151c8cbe/src/core.js#L236

var class2type = {};

//Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。
var getProto = Object.getPrototypeOf;

//相当于 Object.prototype.toString
var toString = class2type.toString;

//hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性
//相当于 Object.prototype.hasOwnProperty
var hasOwn = class2type.hasOwnProperty;

//因为 hasOwn 是一个函数,所以这里调用的是内置对象 Function 的toString() 方法
//相当于 Function.prototype.toString
var fnToString = hasOwn.toString;

//相当于 Function.prototype.toString.call(Object)
//就是Object 构造函数 转字符串的结果
// ObjectFunctionString 其实就是 "function Object() { [native code] }" 这样的一个字符串
var ObjectFunctionString = fnToString.call(Object);

function isPlainObject (obj) {
 var proto, Ctor;

总结

从源码来看,isPlainObject()方法 的实现,主要分三部分

1、去掉类型不是Object 的,

用的是 Object.prototype.toString.call() 方法,这个方法所有类型都会得到不同的字符串,而不是用 typeof,因为 typeof 只能区分基本类型,比如数组,typeof 返回的还是 “object” 字符串

var arr = [];
var obj = {};

typeof arr;    //"object"
typeof obj;    //"object"
typeof document;    //"object"

Object.prototype.toString.call(arr);    //"[object Array]"
Object.prototype.toString.call(obj);    //"[object Object]"
Object.prototype.toString.call(document);    //"[object HTMLDocument]"

2、判断对象有没有原型,没有原型的对象算纯粹对象

3、判断是不是通过 "{}" 或 "new Object" 方式创建的对象

这就要判断他们的构造函数了,所以用 Function.prototype.toString 方法

Function 对象覆盖了从 Object 继承来的 Object.prototype.toString 方法。
函数的 toString 方法会返回一个表示函数源代码的字符串。具体来说,包括 function关键字,形参列表,大括号,以及函数体中的内容。

function fn(said){
  this.say = said;
}

Function.prototype.toString.call(fn); 
//"function fn(said){
//  this.say = said;
//}"

Function.prototype.toString.call(Object);
//"function Object() { [native code] }"
jQuery 相关文章推荐
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
May 01 jQuery
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
May 20 jQuery
bootstrap+jQuery实现的动态进度条功能示例
May 25 jQuery
jQuery模拟爆炸倒计时功能实例代码
Aug 21 jQuery
jQuery使用zTree插件实现可拖拽的树示例
Sep 23 jQuery
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
使用jQuery 操作table 完成单元格合并的实例
Dec 27 jQuery
jQuery实现的电子时钟效果完整示例
Apr 28 jQuery
jQuery实现每隔一段时间自动更换样式的方法分析
May 03 jQuery
jQuery Migrate 插件用法实例详解
May 22 jQuery
jQuery实现回到顶部效果
Oct 19 jQuery
jQuery是用来干什么的 jquery其实就是一个js框架
Feb 04 jQuery
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 #jQuery
jQuery实现碰到边缘反弹的动画效果
Feb 24 #jQuery
jQuery 改变P标签文本值方法
Feb 24 #jQuery
jQuery实现标签子元素的添加和赋值方法
Feb 24 #jQuery
jquery 给动态生成的标签绑定事件的几种方法总结
Feb 24 #jQuery
jquery动态添加带有样式的HTML标签元素方法
Feb 24 #jQuery
jQuery动态添加li标签并添加属性和绑定事件方法
Feb 24 #jQuery
You might like
PHP处理Oracle的CLOB实例
2014/11/03 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
php批量删除操作代码分享
2017/02/26 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
jQuery原型属性和原型方法详解
2015/07/07 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
js实现左右轮播图
2020/01/09 Javascript
使用Python生成XML的方法实例
2017/03/21 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
Django 路由控制的实现
2019/07/17 Python
python requests证书问题解决
2019/09/05 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
英国在线花园中心:You Garden
2018/06/03 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
网络技术支持面试题
2013/04/22 面试题
应届毕业生的自我鉴定
2013/11/13 职场文书
英语教师岗位职责
2014/03/16 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
答谢会策划方案
2014/05/12 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
教师年终个人总结
2015/02/11 职场文书
读书笔记格式
2015/07/02 职场文书