Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >jQuery中的isPlainObject()方法 实现原理

jQuery中的isPlainObject()方法 实现原理

作者头像
FEWY
发布于 2019-05-27 00:26:30
发布于 2019-05-27 00:26:30
1.4K20
代码可运行
举报
文章被收录于专栏:FEWYFEWY
运行总次数:0
代码可运行

说明

jQuery中的isPlainObject() 函数用于判断指定参数是否是一个纯粹的对象,返回值为Boolean类型。

“纯粹的对象”,就是通过 { }、new Object()、Object.create(null) 创建的对象。

这个方法的作用是为了跟其他的 JavaScript对象如 null,数组,宿主对象(documents),DOM 等作区分,因为这些用 typeof 都会返回object。

使用

语法: $.isPlainObject( object ) 参数说明: object:任意类型 需要进行判断的任意值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$.isPlainObject({});   //true
$.isPlainObject(new Object);   //true
$.isPlainObject(Object.create(null));  //true
$.isPlainObject([]);   //false
$.isPlainObject(document); //false

源码分析

我们来看看jQuery 3.3.1 版本下的源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

  //先去掉类型不是 Object 的
  //也就是用 Object.prototype.toString.call(obj) 这种方式,返回值不是 "[object Object]" 的,比如 数组 window history 
  if (!obj || toString.call(obj) !== "[object Object]") {
    return false;
  }

  //获取对象原型,赋值给 proto 
  proto = getProto(obj);

  //如果对象没有原型,那也算纯粹的对象,比如用 Object.create(null) 这种方式创建的对象 
  if (!proto) {
    return true;
  }

  //最后判断是不是通过 "{}" 或 "new Object" 方式创建的对象
  //如果 proto 有 constructor属性,Ctor 的值就为 proto.constructor,
  //原型的 constructor 属性指向关联的构造函数
  Ctor = hasOwn.call(proto, "constructor") && proto.constructor;

  //如果 Ctor 类型是  "function" ,并且调用Function.prototype.toString 方法后得到的字符串 与 "function Object() { [native code] }" 这样的字符串相等就返回true
  //用来区分 自定义构造函数和 Object 构造函数
  return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
}

总结

从源码来看,isPlainObject()方法 的实现,主要分三部分 1、去掉类型不是Object 的, 用的是 Object.prototype.toString.call() 方法,这个方法所有类型都会得到不同的字符串,而不是用 typeof,因为 typeof 只能区分基本类型,比如数组,typeof 返回的还是 “object” 字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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关键字,形参列表,大括号,以及函数体中的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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] }"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年02月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
求数据或者数据格式!
求数据或者数据格式!
11点赞举报
https://github.com/JackMcKew/pandas_alive 这里就有,data 目录下就有相应的数据和代码。
https://github.com/JackMcKew/pandas_alive 这里就有,data 目录下就有相应的数据和代码。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
看完这篇文章,我彻底爱上了Python动态图表!
关于动态条形图,小F以前推荐过「Bar Chart Race」这个库。三行代码就能实现动态条形图的绘制。
小F
2020/12/16
8180
看完这篇文章,我彻底爱上了Python动态图表!
精选3种制作竞赛动图的方法,收藏
上面的两个动图,就是条形竞赛图和折线竞赛图,今天我们就来看看都有哪些方便的方法来制作呢
陈晨135
2022/01/07
8340
精选3种制作竞赛动图的方法,收藏
【硬核干货】4500字、10个案例分享几个Python可视化小技巧,助你绘制高质量图表
一般在Python当中,我们用于绘制图表的模块最基础的可能就是matplotlib了,今天小编分享几个用该模块进行可视化制作的技巧,帮助你绘制出更加高质量的图表。
用户6888863
2022/04/13
5780
【硬核干货】4500字、10个案例分享几个Python可视化小技巧,助你绘制高质量图表
COVID-19数据分析实战:统计分析及可视化
第一篇文章和第二篇文章我们对line list 数据集进行清洗,以及对文本内容进行词云分析。
统计学家
2020/05/25
1.7K0
COVID-19数据分析实战:统计分析及可视化
精选6种制作竞赛动图的方法,收藏!
上面的两个动图,就是条形竞赛图和折线竞赛图,今天我们就来看看都有哪些方便的方法来制作呢
周萝卜
2022/02/10
1.4K0
精选6种制作竞赛动图的方法,收藏!
Python在Finance上的应用3:处理股票数据基础
欢迎来到Python for Finance教程系列的第3节。在本教程中,我们将使用股票数据进一步进行基本的数据处理和可视化。将要使用的开始代码(在前面的教程中已经介绍过)是:
万能数据的小草
2020/02/19
7720
不让数据动起来,那PPT多没意思啊
数据暴增的年代,数据科学家、分析师在被要求对数据有更深的理解与分析的同时,还需要将结果有效地传递给他人。如何让目标听众更直观地理解?当然是将数据可视化啊,而且最好是动态可视化。
朱小五
2020/06/15
1.3K21
为了这个GIF,我专门建了一个网站
我已经用streamlit+bar_chart_race实现了,然后白嫖了heroku的服务器,大家通过下面的网址上传csv格式的表格就可以轻松制作条形竞赛图,生成的视频可以保存本地。
统计学家
2021/12/27
7720
为了这个GIF,我专门建了一个网站
刷爆全网的动态条形图,原来5行Python代码就能实现!
比如数可视的「花火hanabi」,嫡数的「镝数图表」,以及国外网站「Flourish」。
小F
2020/10/09
2.1K0
刷爆全网的动态条形图,原来5行Python代码就能实现!
深度好文 | Matplotlib 可视化最有价值的 50 个图表(附完整 Python 源代码)
在数据分析和可视化中最有用的 50 个 Matplotlib 图表。 这些图表列表允许您使用 python 的 matplotlib 和 seaborn 库选择要显示的可视化对象。
数据派THU
2019/05/09
1.7K0
深度好文 | Matplotlib 可视化最有价值的 50 个图表(附完整 Python 源代码)
时间序列基础教程总结!
最近在Kaggle发现了一个关于时间序列比较不错的kernal,决定翻译一下搬运过来,大家一起学习交流一下。如果预期不错的话准备写四章,分别是时间序列Python基本操作、统计分析、时间序列分解与随机游走、统计建模分析。
阿泽 Crz
2021/03/24
7860
如何用Jupyter Notebook制作新冠病毒疫情追踪器?
新冠肺炎已在全球范围内爆发。为了解全球疫情分布情况,有技术人员使用Jupyter Notebook绘制了两种疫情的等值线地图(choropleth chart)和散点图。
AI科技大本营
2020/03/18
8060
做动态图表,没有数据?用Python就能获取!
先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕。
小F
2020/11/09
7000
做动态图表,没有数据?用Python就能获取!
《Pandas Cookbook》第11章 用Matplotlib、Pandas、Seaborn进行可视化
一章内容介绍三块内容,感觉哪个都没说清。 In[1]: import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline 1. matplotlib入门 Matplotlib提供了两种方法来作图:状态接口和面向对象。 # 状态接口是通过pyplot模块来实现的,matplotlib会追踪绘图环境的当前状态 # 这种方法适合快速画一些简单
SeanCheney
2018/11/29
1.7K0
《Pandas Cookbook》第11章 用Matplotlib、Pandas、Seaborn进行可视化
用Python优雅地制作动态条形图
公众号“算法美食屋”后台回复关键字:动态图,可添加作者微信获取完整代码和人口数据集。
lyhue1991
2021/06/15
5250
超酷炫,百行Python代码制作动态曲线图
主要思路是设计plot_frame绘图函数绘制逐桢图片,然后用matplotlib.animation构建动画,如果有需要,还可以导出成gif和mp4。
lyhue1991
2021/06/15
1K0
超长好文 |Matplotlib 可视化最有价值的 50 个图表(附完整 Python 源代码)
在数据分析和可视化中最有用的 50 个 Matplotlib 图表。 这些图表列表允许您使用 python 的 matplotlib 和 seaborn 库选择要显示的可视化对象。
小小詹同学
2019/11/12
1.2K0
超长好文 |Matplotlib 可视化最有价值的 50 个图表(附完整 Python 源代码)
干货 | 20个教程,掌握时间序列的特征分析(附代码)
【导语】时间序列是指以固定时间为间隔的序列值。本篇教程将教大家用 Python 对时间序列进行特征分析。
AI科技大本营
2019/07/11
6.1K0
干货 | 20个教程,掌握时间序列的特征分析(附代码)
使用Pandas_Alive做数据可视化,使图表动起来
Pandas_Alive不仅包含动态条形图,还可以绘制动态曲线图、气泡图、饼状图、地图等。本文记录环境安装,数据获取,到最后生成动态gif全过程。
IT不难
2022/04/23
1.4K0
使用Pandas_Alive做数据可视化,使图表动起来
用python做时间序列预测五:时间序列缺失值处理
有的时候,一些时刻或连续时间段内的值无法采集到,或者本身就没有值,本文将介绍如何处理这种情况。 一般而言,有以下几种方法: 对所有的缺失值用零填充。 前向填充:比如用周一的值填充缺失的周二的值 后向填
AI粉嫩特工队
2020/06/10
4.5K0
推荐阅读
相关推荐
看完这篇文章,我彻底爱上了Python动态图表!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验