详解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实现前端分页功能
Mar 23 jQuery
jQuery使用JSONP实现跨域获取数据的三种方法详解
May 04 jQuery
jQuery简介_动力节点Java学院整理
Jul 04 jQuery
jQuery选择器_动力节点Java学院整理
Jul 05 jQuery
使用jquery+iframe做一个ajax上传效果(实例)
Aug 24 jQuery
jQuery 开发之EasyUI 添加数据的实例
Sep 26 jQuery
jQuery实现动态控制页面元素的方法分析
Dec 20 jQuery
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 jQuery
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 jQuery
详解jQuery设置内容和属性
Apr 11 jQuery
jquery将信息遍历到界面上实例代码
Jan 21 jQuery
jQuery操作选中select下拉框的值代码实例
Feb 07 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获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
php二维码生成
2015/10/19 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
JavaScript实现简单验证码
2020/08/24 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
应届生人事助理求职信
2013/11/09 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
先进典型事迹材料
2014/12/29 职场文书
安全教育日主题班会
2015/08/13 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS