判斷資料型別的方法有哪些,幾種方法的優缺點和區別

2021-10-05 07:47:55 字數 2214 閱讀 6068

1.typeof

這個方法很常見,一般用來判斷基本資料型別,如:string,number,boolean,symbol,bigint(es10新增一種基本資料型別bigint),undefined等。

typeof 目前能返回string,number,boolean,symbol,bigint,unfined,object,function這八種判斷型別

2.instanceof

一般用來判斷引用資料型別的判斷,如:object,function,array,date,regexp等

instanceof 主要的作用就是判斷乙個例項是否屬於某種型別,例如:

當然,instanceof 也可以判斷乙個例項是否是其父型別或者祖先型別的例項。

但是 instanceof 的原理是什麼呢?可以用下面的**解釋一下:

其實 instanceof 主要的實現原理就是只要右邊變數的 prototype 在左邊變數的原型鏈上即可。因此,instanceof 在查詢的過程中會遍歷左邊變數的原型鏈,直到找到右邊變數的 prototype,如果查詢失敗,則會返回 false,告訴我們左邊變數並非是右邊變數的例項。

4、object.prototype.tostring(這個是判斷型別最準的方法)

tostring是object原型物件上的乙個方法,該方法預設返回其呼叫者的具體型別,更嚴格的講,是 tostring執行時this指向的物件型別, 返回的型別格式為[object,***],***是具體的資料型別,其中包括:string,number,boolean,undefined,null,function,date,array,regexp,error,htmldocument,… 基本上所有物件的型別都可以通過這個方法獲取到。

需要注意的是,必須通過object.prototype.tostring.call來獲取,而不能直接 new date().tostring(), 從原型鏈的角度講,所有物件的原型鏈最終都指向了object, 按照js變數查詢規則,其他物件應該也可以直接訪問到object的tostring方法,而事實上,大部分的物件都實現了自身的tostring方法,這樣就可能會導致object的tostring被終止查詢,因此要用call來強制執行object的tostring方法。

3、constructor

當乙個函式f被定義時,js引擎會為f新增prototype原型,然後再在prototype上新增乙個constructor屬性,並讓其指向f的引用。如下所示:

當執行 var f = new f() 時,f被當成了建構函式,f是f的例項物件,此時f原型上的constructor傳遞到了f上,因此f.constructor == f

可以看出,js在函式f的原型上定義了constructor,當f被當作建構函式用來建立物件時,建立的新物件就被標記為了「f」 型別,使得新物件有名有姓,可以追溯。

同理,js中的資料型別也遵守這個規則:

細節問題:

1.null和undefined是無效的物件,因此是不會有constructor存在的,這兩種型別的資料可以通過第四種方法來判斷。

2.js物件的constructor是不穩定的,這個主要體現在自定義物件上,當開發者重寫prototype後,原有的constructor會丟失,constructor會預設為object

最後感謝這位博主的優質文章解決了我的難題。同時也希望可以幫助大家!

JavaScript資料型別的幾種判斷方法

js資料型別的判斷主要有三種方法 typeof instanceof object.prototype.tostring.call 1 typeof 返回乙個表示資料型別的字串,返回結果包括 number boolean string symbol object undefined function...

判斷資料型別幾種方法

常用的判斷資料型別的方法主要有 typeof,instanceof,constructor,object.prototype.tostring 下面來分別介紹 1 typeof 返回乙個字串,表示未經計算的運算元的型別。console.log typeof 42 number 缺點 對於陣列和物件或...

判斷資料型別的幾種方法

let arr name age arr.tostring name,age object.prototype.tostring.call arr object array 該方法對於所有基本的資料型別都能進行判斷,null和undefined也行 object.prototype.tostring...