在ES6以前,javascript有6種基本的數據類型:主要分為5種原始類型和1種引用類型。(bigint
,symbol
此處暫不處理)
原始類型:Boolean、Number、String、Undefined、Null、
引用類型:Object
原始類型,它們的值只包含一個單獨的內容,存放在棧中;
引用類型用於存儲數據集合或更復雜的實體,存放在堆中,在棧中會存放一個指針,指向堆中的地址;引用類型除 Object 外,還包括 Function 、Array、RegExp、Date 等等。
類型的多樣型,使得js的類型判斷也存在多種方法,以下就常用的幾種介紹:
1.typeof
typeof是最常用的類型判斷方法:Boolean、Number、String、Undefined、Null、Object、Function
采用typeof判斷出來的類型對應關系分別為:boolean、number、string、undefined、object、object、function。可以看出除了null跟object其他的均能判斷出正確的類型
采用typeof判斷出來的類型對應關系分別為:boolean、number、string、undefined、object、object、function。可以看出除了null跟object其他的均能判斷出正確的類型
2.instanceof
用來判斷 a 是否為 b 的實例,寫法為 a instanceof b; 是則返回true,否則返回false
3.constructor
每一個對象實例都可以通過constructor訪問其構造函數,因此可以通過constructor判斷一些引用類型的數據類型:
var obj = {a: 1} var array = [1, 2, 3]; var date = new Date(); var error = new Error(); var reg = /a/g; var func = function a(){}; console.log(obj.constructor === Object) // true console.log(array.constructor === Array) // true console.log(date.constructor === Date) // true console.log(error.constructor === Error) // true console.log(reg.constructor === RegExp) // true console.log(func.constructor === Function) // true
4.Object.prototype.toString
話不多說,先上代碼:

var number = 1; // [object Number] var string = '123'; // [object String] var boolean = true; // [object Boolean] var und = undefined; // [object Undefined] var nul = null; // [object Null] var obj = {a: 1} // [object Object] var array = [1, 2, 3]; // [object Array] var date = new Date(); // [object Date] var error = new Error(); // [object Error] var reg = /a/g; // [object RegExp] var func = function a(){}; // [object Function] let tostring = Object.prototype.toString console.log(tostring.call(1)) console.log(tostring.call('123')) console.log(tostring.call(true)) console.log(tostring.call(null)) console.log(tostring.call(undefined)) console.log(tostring.call({})) console.log(tostring.call(new Date)) console.log(tostring.call(new Array)) console.log(tostring.call(new Error)) console.log(tostring.call(a)) console.log(tostring.call(/a/g))
通過如上代碼,是不是發現通過調用 Object.prototype.toString 會返回一個由 "[object " 和 class 和 "]" 組成的字符串,而 class 是要判斷的對象的內部屬性。
於是,結合typeof封裝了一個type方法,可以快速判斷出數據類型的公共方法:
function type(param) { // es6中null的類型為object if(param === null){ return param+'' } if(typeof param === 'object'){ let val = Object.prototype.toString.call(param).split(' ')[1] let type = val.substr(0,val.length-1).toLowerCase() return type }else { return typeof param } } console.log(type(number)) // number console.log(type(string)) // string console.log(type(boolean)) // boolean console.log(type(und)) // undefined console.log(type(nul)) // null console.log(type(obj)) // object console.log(type(array)) // array console.log(type(date)) // date console.log(type(error)) // error console.log(type(reg)) // regexp console.log(type(func)) // function