详解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插件imgAreaSelect基础讲解
May 26 jQuery
使用 jQuery 实现表单验证功能
Jul 05 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
jQuery轮播图实例详解
Aug 15 jQuery
jQuery+Datatables实现表格批量删除功能【推荐】
Oct 24 jQuery
jQuery实现的老虎机跑动效果示例
Dec 29 jQuery
jQuery实现左右两个列表框的内容相互移动功能示例
Jan 27 jQuery
jQuery中使用validate插件校验表单功能
May 24 jQuery
9种方法优化jQuery代码详解
Feb 04 jQuery
jquery实现简单自动轮播图效果
Jul 29 jQuery
jQuery实现电梯导航模块
Dec 22 jQuery
jquery实现鼠标悬浮弹出气泡提示框
Dec 23 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内存使用情况如何获取
2015/10/10 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
js form action动态修改方法
2008/11/04 Javascript
Ext 今日学习总结
2010/09/19 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
python opencv读mp4视频的实例
2018/12/07 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
python写日志文件操作类与应用示例
2019/07/01 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
党支部书记岗位责任制
2014/02/11 职场文书
班班通项目实施方案
2014/02/25 职场文书
外国人聘用意向书
2014/04/01 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
员工辞职信怎么写
2015/02/27 职场文书
英语演讲开场白
2015/05/29 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书