欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解jQuery中的isPlainObject()使用方法

 更新時(shí)間:2018年02月27日 10:54:52   作者:FEWY  
本篇文章給大家詳細(xì)分析了jQuery中的isPlainObject()使用方法,對(duì)此有需求的讀者們可以學(xué)習(xí)下。

說(shuō)明

jQuery中的isPlainObject() 函數(shù)用于判斷指定參數(shù)是否是一個(gè)純粹的對(duì)象,返回值為Boolean類(lèi)型。

"純粹的對(duì)象",就是通過(guò) { }、new Object()、Object.create(null) 創(chuàng)建的對(duì)象。

這個(gè)方法的作用是為了跟其他的 JavaScript對(duì)象如 null,數(shù)組,宿主對(duì)象(documents),DOM 等作區(qū)分,因?yàn)檫@些用 typeof 都會(huì)返回object。

使用

語(yǔ)法:

$.isPlainObject( object )

參數(shù)說(shuō)明:

object:任意類(lèi)型 需要進(jìn)行判斷的任意值。

$.isPlainObject({});  //true
$.isPlainObject(new Object);  //true
$.isPlainObject(Object.create(null));  //true
$.isPlainObject([]);  //false
$.isPlainObject(document);  //false

源碼分析

我們來(lái)看看jQuery 3.3.1 版本下的源碼:https://github.com/jquery/jquery/blob/ac9e3016645078e1e42120822cfb2076151c8cbe/src/core.js#L236

var class2type = {};

//Object.getPrototypeOf() 方法返回指定對(duì)象的原型(內(nèi)部[[Prototype]]屬性的值)。
var getProto = Object.getPrototypeOf;

//相當(dāng)于 Object.prototype.toString
var toString = class2type.toString;

//hasOwnProperty() 方法會(huì)返回一個(gè)布爾值,指示對(duì)象自身屬性中是否具有指定的屬性
//相當(dāng)于 Object.prototype.hasOwnProperty
var hasOwn = class2type.hasOwnProperty;

//因?yàn)?hasOwn 是一個(gè)函數(shù),所以這里調(diào)用的是內(nèi)置對(duì)象 Function 的toString() 方法
//相當(dāng)于 Function.prototype.toString
var fnToString = hasOwn.toString;

//相當(dāng)于 Function.prototype.toString.call(Object)
//就是Object 構(gòu)造函數(shù) 轉(zhuǎn)字符串的結(jié)果
// ObjectFunctionString 其實(shí)就是 "function Object() { [native code] }" 這樣的一個(gè)字符串
var ObjectFunctionString = fnToString.call(Object);

function isPlainObject (obj) {
 var proto, Ctor;

總結(jié)

從源碼來(lái)看,isPlainObject()方法 的實(shí)現(xiàn),主要分三部分

1、去掉類(lèi)型不是Object 的,

用的是 Object.prototype.toString.call() 方法,這個(gè)方法所有類(lèi)型都會(huì)得到不同的字符串,而不是用 typeof,因?yàn)?typeof 只能區(qū)分基本類(lèi)型,比如數(shù)組,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、判斷對(duì)象有沒(méi)有原型,沒(méi)有原型的對(duì)象算純粹對(duì)象

3、判斷是不是通過(guò) "{}" 或 "new Object" 方式創(chuàng)建的對(duì)象

這就要判斷他們的構(gòu)造函數(shù)了,所以用 Function.prototype.toString 方法

Function 對(duì)象覆蓋了從 Object 繼承來(lái)的 Object.prototype.toString 方法。
函數(shù)的 toString 方法會(huì)返回一個(gè)表示函數(shù)源代碼的字符串。具體來(lái)說(shuō),包括 function關(guān)鍵字,形參列表,大括號(hào),以及函數(shù)體中的內(nèi)容。

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] }"

相關(guān)文章

最新評(píng)論