详解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 相关文章推荐
原生Aajax 和jQuery Ajax 写法个人总结
Mar 24 jQuery
jQuery扇形定时器插件pietimer使用方法详解
Jul 18 jQuery
jQuery Position方法使用和兼容性
Aug 23 jQuery
jQuery实现的弹幕效果完整实例
Sep 06 jQuery
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
jQuery实现table表格checkbox全选的方法分析
Jul 04 jQuery
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 jQuery
jquery简单实现纵向的无缝滚动代码实例
Apr 01 jQuery
基于jQuery的时间戳与日期间的转化
Jun 21 jQuery
jQuery中DOM操作原则实例分析
Aug 01 jQuery
jQuery带控制按钮轮播图插件
Jul 31 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中trim()函数简单使用指南
2015/04/16 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
jquery实现图片按比例缩放示例
2014/07/01 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
利用python实现微信头像加红色数字功能
2018/03/26 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
Java的五个基础面试题
2016/02/26 面试题
nohup的用法
2014/08/10 面试题
标准自荐信范文
2014/01/29 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
会走路的树教学反思
2014/02/20 职场文书
信仰心得体会
2014/09/05 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL