判斷JS類型,有以下幾種方法:1、typeof 2、object.property.toString.call 3、instance of。
(一)JS的類型
JS的基本類型共有七種:bigInt(bigInt是一種內置對象,是處symbol外的第二個內置類型)、number、string、boolen、symbol、undefined、null。復雜數據類型有對象(object)包括基本的對象、函數(Function)、數組(Array)和內置對象(Data等)。
(二)判斷JS的類型
方法一、typeof方法
基本數據類型除了null外都返回對應類型的字符串。
typeof 1 // "number" typeof 'a' // "string" typeof true // "boolean" typeof undefined // "undefined" typeof Symbol() // "symbol" typeof 42n // "bigint"
注:判斷一個變量是否被聲明可以用(typeof 變量 === “undefined”)來判斷
null返回“object”
typeof null // "object"
因為歷史遺留的原因。typeof null 嘗試返回為null失敗了,所以要記住,typeof null返回的是object。
特殊值NaN返回的是 "number"
typeof NaN // "number"
而復雜數據類型里,除了函數返回了"function"其他均返回“object”
typeof({a:1}) // "object" 普通對象直接返回“object” typeof [1,3] // 數組返回"object" typeof(new Date) // 內置對象 "object"
函數返回"function"
typeof function(){} // "function"
所以我們可以發現,typeof可以判斷基本數據類型,但是難以判斷除了函數以外的復雜數據類型。於是我們可以使用第二種方法,通常用來判斷復雜數據類型,也可以用來判斷基本數據類型。
方法二、object.property.toString.call方法 ,他返回"[object, 類型]",注意返回的格式及大小寫,前面是小寫,后面是首字母大寫。
基本數據類型都能返回相應的類型。
Object.prototype.toString.call(999) // "[object Number]" Object.prototype.toString.call('') // "[object String]" Object.prototype.toString.call(Symbol()) // "[object Symbol]" Object.prototype.toString.call(42n) // "[object BigInt]" Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(undefined) // "[object Undefined]" Object.prototype.toString.call(true) // "[object Boolean]
復雜數據類型也能返回相應的類型
Object.prototype.toString.call({a:1}) // "[object Object]" Object.prototype.toString.call([1,2]) // "[object Array]" Object.prototype.toString.call(new Date) // "[object Date]" Object.prototype.toString.call(function(){}) // "[object Function]"
這個方法可以返回內置類型
方法三、obj instanceof Object ,可以左邊放你要判斷的內容,右邊放類型來進行JS類型判斷,只能用來判斷復雜數據類型,因為instanceof 是用於檢測構造函數(右邊)的 prototype
屬性是否出現在某個實例對象(左邊)的原型鏈上。
[1,2] instanceof Array // true (function(){}) instanceof Function // true ({a:1}) instanceof Object // true (new Date) instanceof Date // true
obj instanceof Object方法也可以判斷內置對象。
缺點:在不同window或者iframe間,不能使用instanceof。
其他方法:除了以上三種方法,還有constructor方法 和 duck type方法,具體在文章就不介紹了,個人覺得吃透分清上面三種方法已經足夠了。