详解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 EasyUI 组件加上清除功能的方法(详解)
Apr 13 jQuery
jQuery Validate格式验证功能实例代码(包括重名验证)
Jul 18 jQuery
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
Jul 22 jQuery
Django中使用jquery的ajax进行数据交互的实例代码
Oct 15 jQuery
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 jQuery
JQuery获取元素尺寸、位置及页面滚动事件应用示例
May 14 jQuery
JQuery 实现文件下载的常用方法分析
Oct 29 jQuery
jQuery实现可编辑的表格
Dec 11 jQuery
详解jQuery中的prop()使用方法
Jan 05 jQuery
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
Apr 04 jQuery
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
jquery实现广告上下滚动效果
Mar 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 自定义错误处理函数trigger_error()
2013/03/26 PHP
PHP引用返回用法示例
2016/05/28 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
js自带函数备忘 数组
2006/12/29 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
基于javascript实现样式清新图片轮播特效
2016/03/30 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
python实现读取并显示图片的两种方法
2017/01/13 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
Python命令行解析模块详解
2018/02/01 Python
Python列表解析配合if else的方法
2018/06/23 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
助学金感谢信
2015/01/20 职场文书
2015年实习单位评语
2015/03/25 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android