详解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仿微信聊天界面
May 06 jQuery
JQuery 封装 Ajax 常用方法(推荐)
May 21 jQuery
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
Jun 02 jQuery
Mui使用jquery并且使用点击跳转新窗口的实例
Aug 19 jQuery
jquery在vue脚手架中的使用方式示例
Aug 29 jQuery
jQuery 利用ztree实现树形表格的实例代码
Sep 27 jQuery
jQuery实现checkbox的简单操作
Nov 18 jQuery
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
Apr 27 jQuery
IE8中jQuery.load()加载页面不显示的原因
Nov 15 jQuery
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
Jun 18 jQuery
jQuery-App输入框实现实时搜索
Nov 19 jQuery
jquery插件实现搜索历史
Apr 24 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
基于mysql的论坛(7)
2006/10/09 PHP
php模板中出现空行解决方法
2011/03/08 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
根据当前时间在jsp页面上显示上午或下午
2014/08/18 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
[01:11]回顾历届DOTA2国际邀请赛中国区预选赛
2017/06/26 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
Python中url标签使用知识点总结
2020/01/16 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
群众路线剖析材料(四风问题)
2014/10/08 职场文书
专家推荐信范文
2015/03/26 职场文书
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
Spring 使用注解开发
2022/05/20 Java/Android