JavaScript中的資料型別分為基礎資料型別和引用資料型別,其中
基本資料型別:string、number、boolean、undefined、null和Symbol,
引用資料型別:Object、Function、Date、RegExp、Number、String、Boolean
因為一般情況下不會以如下方式建立字串和數字,故本文不討論這種型別。
let str = new String('str'),
num = new Number(123),
boole = Boolean(true);複製程式碼
首先建立一些供檢測的變數
let myNull = null,
myUndefined = undefined,
mySymbol = Symbol(123),
str = 'str',
num = 123,
boole = false,
arr = [1,2,3],
obj = {
name:'obj.name'
},
date = new Date(),
reg = /\d{6}/g;
function foo(){};複製程式碼
typeof
首先用常用的方式typeof判斷一下
console.log(typeof myNull); // object
console.log(typeof myUndefined); // undefined
console.log(typeof mySymbol); // symbol
console.log(typeof str); // string
console.log(typeof num); // number
console.log(typeof boole); // boolean
console.log(typeof arr); // object
console.log(typeof obj); // object
console.log(typeof date); // object
console.log(typeof reg); // object
console.log(typeof foo); // function複製程式碼
可見typeof方法對於null和引用資料型別都會返回object,對於其他基本資料型別以及function的判斷都是準確的(typeof null === 'object'的原因這裡不贅述)
instanceof
對於typeof無法準確判斷引用資料型別,可以採用instanceof進行補充判斷
console.log(arr instanceof Array); // true
console.log(obj instanceof Object); // true
console.log(date instanceof Date); // true
console.log(reg instanceof RegExp); // true
console.log(foo instanceof Function); // true複製程式碼
如上所示,此方法只適合判斷變數是不是想要的引用資料型別
constructor
而對於不需要判斷null和undefined的情況,我們還可以使用constructor
constructor 屬性返回對建立此物件的陣列函式的引用
console.log(mySymbol.constructor === Symbol); // true
console.log(str.constructor === String); // true
console.log(num.constructor === Number); // true
console.log(boole.constructor === Boolean); // true
console.log(arr.constructor === Array); // true
console.log(obj.constructor === Object); // true
console.log(date.constructor === Date); // true
console.log(reg.constructor === RegExp); // true
console.log(foo.constructor === Function); // true複製程式碼
和instanceof類似,constructor 方法只適合判斷變數是不是想要的引用資料型別,但是它可以判斷null和undefined除外的所有資料型別,之所以null和undefined不可以,是因為他們作為JavaScript執行環境建立時就存在的基本資料型別,不存在constructor屬性
Object.prototype.toString()
那有沒有一種方法可以準確的判斷所有資料型別的資料型別呢,推薦如下方法
console.log(Object.prototype.toString.call(myNull)); // [object Null]
console.log(Object.prototype.toString.call(myUndefined)); // [object Undefined]
console.log(Object.prototype.toString.call(mySymbol)); // [object Symbol]
console.log(Object.prototype.toString.call(str)); // [object String]
console.log(Object.prototype.toString.call(num)); // [object Number]
console.log(Object.prototype.toString.call(boole)); // [object Boolean]
console.log(Object.prototype.toString.call(arr)); // [object Array]
console.log(Object.prototype.toString.call(obj)); // [object Object]
console.log(Object.prototype.toString.call(date)); // [object Date]
console.log(Object.prototype.toString.call(reg)); // [object RegExp]
console.log(Object.prototype.toString.call(foo)); // [object Function]複製程式碼
如果有錯誤或者不嚴謹的地方,請給予指正,十分感謝!