JavaScript判斷資料型別

王振宇發表於2019-04-04

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]複製程式碼

如果有錯誤或者不嚴謹的地方,請給予指正,十分感謝!


相關文章