欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

三種“類型判斷”的方法,一起手寫instanceof方法的實(shí)現(xiàn)原理

freeflydom
2023年11月27日 11:58 本文熱度 638

在Javascript中,有三種常用的方法用于判斷數(shù)據(jù)類型:

1. typeof操作符

typeof操作符是最常用的判斷數(shù)據(jù)類型的方法之一。它是一個(gè)一元操作符,可以用于判斷一個(gè)值的數(shù)據(jù)類型,并返回一個(gè)表示該數(shù)據(jù)類型的字符串。常見的typeof返回值有:

- "undefined": 用于表示未定義的變量
- "number": 用于表示數(shù)字類型
- "string": 用于表示字符串類型
- "boolean": 用于表示布爾類型
- "object": 用于表示對(duì)象類型(包括數(shù)組、日期、正則表達(dá)式等)
- "function": 用于表示函數(shù)類型
- "bigint": 用于表示大數(shù)字類型
- "symbol": 用于保證創(chuàng)建的值不與其他屬性名產(chǎn)生沖突

例如:

typeof undefined; // "undefined"  

typeof 42; // "number"  

typeof "hello"; // "string"  

typeof true; // "boolean"  

typeof { name: "John" }; // "object"  

typeof function() {}; // "function"  

typeof 123n; // "bigint"

typeof symbol('hello'); //"symbol"

需要注意的是,typeof對(duì)于null的判斷返回的是"object",這是因?yàn)樵贘avascript的早期版本中,null被錯(cuò)誤地認(rèn)為是一個(gè)對(duì)象。而對(duì)于函數(shù)類型,則返回"function".

2. instanceof操作符

instanceof操作符用于判斷一個(gè)對(duì)象是否屬于某個(gè)構(gòu)造函數(shù)的實(shí)例。它比typeof更適用于判斷對(duì)象類型,因?yàn)樗梢詼?zhǔn)確地判斷多層原型鏈中的實(shí)例關(guān)系。例如:

var arr = [];  

var date = new Date();  

var obj = {};

var fn = function(){};

  

arr instanceof Array; // true  

date instanceof Date; // true  

obj instanceof Object; // true  

fn instanceof Function; // true  

instanceof判斷的結(jié)果是一個(gè)布爾值,如果對(duì)象是指定構(gòu)造函數(shù)的實(shí)例,則返回true,否則返回false。

同時(shí),也正是因?yàn)閕nstanceof操作符可以判斷多層原型鏈中的實(shí)例關(guān)系,那函數(shù)和數(shù)組不也可以看作是一個(gè)對(duì)象嗎,那用他們用instanceof操作符來(lái)判斷和Object的關(guān)系,是不是也能得到true呢,我們來(lái)看一看:

var arr = []; 

var fn = function(){};


arr instanceof Object; // true  

fn instanceof Object; // true  

結(jié)果也是true,欸,arr instanceof Array是true,arr instanceof Object也是true,這時(shí)候我們是不是開始好奇instanceof方法的實(shí)現(xiàn)原理了,怎么這兩個(gè)結(jié)果都能是true呢。

這時(shí)候我們不妨先來(lái)大膽猜測(cè)一波,我們都知道,arr數(shù)組的創(chuàng)建實(shí)際是通過(guò)new構(gòu)造函數(shù)Array()得到的,那arr就是構(gòu)造函數(shù)Array()的一個(gè)實(shí)例對(duì)象,所以當(dāng)我們判斷arr instanceof Array時(shí), 如果在instanceof方法實(shí)現(xiàn)原理內(nèi)部,用arr的隱式原型(arr.__proto__)去和Array的顯示原型(Array.prototype)比較,相等就返回true,否則返回false,通過(guò)原型的知識(shí),這么想arr instanceof Array返回true是不是非常合情合理。(注:如果還有不太懂原型知識(shí)的小伙伴可以先看看我之前的原型知識(shí)文章喔~
但是,又好像還差一點(diǎn)吼,那用剛剛那個(gè)想法判斷arr instanceof Object,這時(shí)候就要用arr的隱式原型(arr.__proto__)去和Object的顯示原型(Object.prototype)進(jìn)行比較了,那他兩是不是很明顯就不相等了,這時(shí)估計(jì)有看過(guò)我原型文章聰明的小伙伴知道了,這時(shí)候他們不相等,arr的隱式原型arr.__proto__對(duì)象會(huì)再用它的隱式原型,也就是arr.__proto__.__proto__,再去和Object的顯示原型(Object.prototype)進(jìn)行比較,這時(shí)候會(huì)發(fā)現(xiàn)他們是不是就相等啦,結(jié)果返回true。
欸,對(duì)嘍!就是這樣思路!非常的棒!實(shí)例對(duì)象 instanceof 數(shù)據(jù)類型 就是先通過(guò)判斷實(shí)例對(duì)象.__proto和數(shù)據(jù)類型的prototype是否相等,相等直接返回true,不相等就通過(guò)原型鏈,再往上找,看實(shí)例對(duì)象.__proto.__proto和數(shù)據(jù)類型的prototype是否相等,要是還不相等就再往上,直到實(shí)例對(duì)象.__proto.__proto.__proto為null了,還是和數(shù)據(jù)類型的prototype不相等,則返回false。
那我們帶著這個(gè)思路是不是非常清晰的就知道了instanceof方法的實(shí)現(xiàn)原理啦!接下來(lái),我們一起手寫代碼來(lái)實(shí)現(xiàn)一下叭!代碼如下:

//L 實(shí)例對(duì)象

//R 要判斷的數(shù)據(jù)類型

function instanceOF(L,R){

    while(L !== null){

        // 用實(shí)例對(duì)象的__proto__屬性和要判斷的數(shù)據(jù)類型的prototype進(jìn)行判斷

        //相等返回true,不相等再用實(shí)例對(duì)象的__proto__的__proto__屬性去判斷

        //直到L.__proto__.__proto__...為null,就通過(guò)原型鏈根本找不到相等的了,返回false.

        if(L.__proto__ === R.prototype){  

            return true

        }

        else L = L.__proto__

    }

    return false

}


//驗(yàn)證我們手寫的instanceOF是否正確

console.log(instanceOF([],Array)); //true

console.log(instanceOF([],Object));//true

所以,搞明白之后,是不是覺得手寫instanceof方法非常簡(jiǎn)單啦!好,那既然數(shù)組,函數(shù)用instanceof方法和object數(shù)據(jù)類型進(jìn)行判斷都為true,所以這種方法好像也不是那么完美,并不能精準(zhǔn)判斷對(duì)象的類型。那我們不妨看看下面另一種方法。

3. Object.prototype.toString方法

Object.prototype.toString是一個(gè)通用的方法,可以返回一個(gè)對(duì)象的內(nèi)部屬性[[Class]]的值,從而判斷對(duì)象的類型。toString方法被重寫,并通過(guò)不同的內(nèi)部屬性來(lái)標(biāo)識(shí)不同的類型。例如:

Object.prototype.toString.call(undefined); // "[object Undefined]"  

Object.prototype.toString.call(42); // "[object Number]"  

Object.prototype.toString.call("hello"); // "[object String]"  

Object.prototype.toString.call(true); // "[object Boolean]"  

Object.prototype.toString.call({ name: "John" }); // "[object Object]"  

Object.prototype.toString.call(function() {}); // "[object Function]"  

這時(shí)小伙伴要問啦,不是講Object.prototype.toString方法嘛,怎么后面還跟了一個(gè)call方法呢,好,這時(shí)候我們?cè)囋嚥患觕all方法,看看結(jié)果如何:

console.log(Object.prototype.toString(undefined))// "[object Object]"

console.log(Object.prototype.toString(42))// "[object Object]"  

console.log(Object.prototype.toString("hello"))// "[object Object]" 

這時(shí)會(huì)發(fā)現(xiàn)結(jié)果都是[object Object]對(duì)象類型,當(dāng)直接調(diào)Object.prototype.toString時(shí),它的 this 值會(huì)被設(shè)置為 toString 方法的調(diào)用者,也就是要檢查類型的對(duì)象本身,這里就是Object.prototype對(duì)象,所以得到的結(jié)果都是對(duì)象類型。這時(shí)可以通過(guò)call方法來(lái)改變它的調(diào)用者,從而將this值設(shè)置為我們想要檢查類型的對(duì)象。這樣做可以確保我們獲取到了準(zhǔn)確的內(nèi)部屬性 [[Class]] 的信息,用于判斷對(duì)象的類型。所以,使用Object.prototype.toString.call方法可以準(zhǔn)確地檢查對(duì)象的類型,而不受調(diào)用者的影響。這是一種常用的方法來(lái)判斷對(duì)象類型的標(biāo)準(zhǔn)做法。


作者:小米露
鏈接:https://juejin.cn/post/7299742103688265769
來(lái)源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。



該文章在 2023/11/27 11:58:52 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved