判斷js資料型別的四種方法和原理

2021-09-26 20:18:41 字數 3981 閱讀 2580

怎麼去判斷乙個資料屬於哪個資料型別,這個是很常見的操作,我們一般都會想到typeof和instanceof這兩個常見的方法,但有時候這兩種方法並不能滿足我們的需求。那讓我們來看一下都有哪些可以判斷資料型別的方法吧。

1.typeof

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

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

typeof '123'     //  string

typeof 1 // number

typeof true // boolean

typeof symbol('1') // symbol

typeof 111n // bigint

typeof undefined // undefined

typeof null // object

typeof // object

function c()

typeof c // function

其實我一直有個疑問,null既然屬於基本資料型別,為什麼用typeof返回的是object呢?解答如下:

js 在底層儲存變數的時候,會在變數的機器碼的低位1-3位儲存其型別資訊?

000:物件

010:浮點數

100:字串

110:布林

1:整數

但是對於 undefined 和 null 來說,這兩個值的資訊儲存是有點特殊的。

null:所有機器碼均為0

undefined:用 −2^30 整數來表示

所以,typeof 在判斷 null 的時候就出現問題了,由於 null 的所有機器碼均為0,因此直接被當做了物件來看待。

2.instanceof

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

/s/g instanceof regexp 

// true

new date('2019/01/05') instanceof date

// true

[1,2,3] instanceof array

// true

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

let animal = function () 

let monkey = new animal()

monkey instanceof animal // true

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

let person = function () 

let programmer = function ()

programmer.prototype = new person()

let nicole = new programmer()

nicole instanceof person // true

nicole instanceof programmer // true

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

function new_instance_of(leftvaule, rightvaule) 

if (leftvaule === rightproto)

leftvaule = leftvaule.__proto__

}}

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

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

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

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

object.prototype.tostring.call('') ;   // [object string]

object.prototype.tostring.call(1) ; // [object number]

object.prototype.tostring.call(true) ; // [object boolean]

object.prototype.tostring.call(undefined) ; // [object undefined]

object.prototype.tostring.call(null) ; // [object null]

object.prototype.tostring.call(new function()) ; // [object function]

object.prototype.tostring.call(new date()) ; // [object date]

object.prototype.tostring.call() ; // [object array]

object.prototype.tostring.call(new regexp()) ; // [object regexp]

object.prototype.tostring.call(new error()) ; // [object error]

object.prototype.tostring.call(document) ; // [object htmldocument]

object.prototype.tostring.call(window) ; //[object global] window是全域性物件global的引用

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

判斷資料型別的四種方法

typeof typeof 一般用於判斷基本型別null除外,typeof也可以判斷function 但判斷array,error,null 這幾個引用型別時對會被typeof判斷為object,所以如果想判斷這幾種資料型別,就不能使用 typeof 了,比較有侷限性 instanceof inst...

js的資料型別以及判斷型別的四種方法

四種判斷型別的方法 null 表示定義為空 undefined 表示未定義 string 字串 number 特殊的兩個符號 nan和infinity isnan 判斷乙個數是否為無窮大,nan和任何數都不相等,包括它本身。parseint p1,p2 p1為字串,如果不是則轉換為字串後再進行處理。...

JS型別判斷的四種方法

1.typeof typeof是乙個操作符,其右側跟乙個一元表示式,並返回這個表示式的資料型別。返回的結果用該型別的字串 全小寫字母 形式表示,包括number,string,boolean,undefined,object,function,symbol等。複製 typeof string typ...