最近看到了不少關於數據類型判斷的方法,總結了下javascript
1、javascript的數據類型java
js數據分爲兩種類型:原始數據類型和引用數據類型。
原始數據類型有:string、number、boolean、undefined和null
引用數據類型有:Function、Object、Date、RegExp、Number、String、Boolean和自定義類等
其中原始數據類型也稱基礎數據類型,是不可拆分的數據類型,他存在於棧中;而引用數據類型也是一般意義上所說的類,存在於堆中。
這二者的一個重要的區別在於原始數據類型在賦值的時候使用的是傳值的方式,而引用數據類型在賦值時使用的是傳址(指針)的方式。jquery
var str1 = "string"; var str2 = str1; str2 = "another string"; alert(str1); //"string" var obj1 = {key1:1}; var obj2 = obj1; obj2.key1 = 2; alert(obj1.key1) //2
2、javascript類型判斷正則表達式
一、typeof()函數
對於原始數據類型,咱們可使用typeof()函數來判斷他的數據類型:數組
typeof(1) //number typeof("1") //string typeof(true) //boolean typeof(undefined) //undefined typeof(null) //object
註釋:您也許會問,爲何 typeof 運算符對於 null 值會返回 "object"。這其實是 JavaScript 最初實現中的一個錯誤,而後被 ECMAScript 沿用了。如今,null 被認爲是對象的佔位符,從而解釋了這一矛盾,但從技術上來講,它仍然是原始值。框架
二、instanceof
typeof()函數對於原始類型的判斷還差強人意,但他是無法用來區分引用數據類型的,由於全部的引用數據類型都會返回"object"。因而javascript引入了java中使用的instanceof,用來判斷一個變量是不是某個對象的實例,因此對於引用類型咱們使用instanceof來進行類型判斷。ide
var obj = {}; obj instanceof Object; //true var arr = []; arr instanceof Array; //true var now = new Date(); now instanceof Date; //true var func = function(){}; func instanceof Function; //true var str = "string"; str instanceof String; //false
如上面所示,instanceof對於引用類型的支持很好,但他是沒法對原始類型進行判斷,因此通常都是在typeof判斷爲object時才使用instanceof。函數
三、Object.prototype.toString.call()
在javascript高級程序設計中提供了另外一種方法,能夠通用的來判斷原始數據類型和引用數據類型,先看代碼:this
var num1 = 1; var num2 = new Number(1); Object.prototype.toString.call(num1) == "[object Number]"; //true Object.prototype.toString.call(num2) == "[object Number]"; //true var arr = []; Object.prototype.toString.call(arr) == "[object Array]"; //true var func = function(){}; Object.prototype.toString.call(func) == "[object Function]"; //true function A(){}; var a = new A(); Object.prototype.toString.call(a) == "[object Object]"; //true
如上所示,這個方法提供了一個通用的數據類型判斷模式,雖然對於自定義類的判斷還無法作到,但在平常的類型判斷中咱們更多的是針對非自定義類,對於自定義類咱們也能夠轉使用instanceof來進行判斷,因此這種方法能夠成爲一種通用的類型判斷方法。spa
下面附上經常使用的類型判斷函數集合:
var valide = (function(){ // 是不是字符串 function isString(value){ return Object.prototype.toString.call(value) == "[object String]"; } // 是不是數字 function isNumber(value){ return Object.prototype.toString.call(value) == "[object Number]"; } // 是不是布爾值 function isBoolean(value){ return Object.prototype.toString.call(value) == "[object Boolean]"; } // 是否undefined function isUndefined(value){ return Object.prototype.toString.call(value) == "[object Undefined]"; } // 是不是null function isNull(value){ return Object.prototype.toString.call(value) == "[object Null]"; } // 是否數組 function isArray(value){ return Object.prototype.toString.call(value) == "[object Array]"; } // 是不是函數 function isFunction(value){ return Object.prototype.toString.call(value) == "[object Function]"; } // 是不是對象 function isObject(value){ return Object.prototype.toString.call(value) == "[object Object]"; } // 是不是正則表達式 function isRegExp(value){ return Object.prototype.toString.call(value) == "[object RegExp]"; } // 是不是日期對象 function isDate(value){ return Object.prototype.toString.call(value) == "[object Date]"; } return { isString: isString, isNumber: isNumber, isBoolean: isBoolean, isUndefined: isUndefined, isNull: isNull, isArray: isArray, isFunction: isFunction, isObject: isObject, isRegExp: isRegExp, isDate: isDate }; })();
四、constructor
在W3C定義中的定義:constructor 屬性返回對建立此對象的數組函數的引用
就是返回對象相對應的構造函數。從定義上來講跟instanceof不太一致,但效果都是同樣的
如: (a instanceof Array) //a是否Array的實例?true or false
(a.constructor == Array) // a實例所對應的構造函數是否爲Array? true or false
舉個例子:
function employee(name,job,born){ this.name=name; this.job=job; this.born=born; } var bill=new employee("Bill Gates","Engineer",1985); console.log(bill.constructor); //輸出function employee(name, jobtitle, born){this.name = name; this.jobtitle = job; this.born = born;}
那麼判斷各類類型的方法就是:
console.log([].constructor == Array); console.log({}.constructor == Object); console.log("string".constructor == String); console.log((123).constructor == Number); console.log(true.constructor == Boolean);
較爲嚴謹而且通用的方法:
function isArray(object){ return object && typeof object==='object' && Array == object.constructor; }
!!注意:
使用instaceof和construcor,被判斷的array必須是在當前頁面聲明的!好比,一個頁面(父頁面)有一個框架,框架中引用了一個頁面(子頁面),在子頁面中聲明瞭一個array,並將其賦值給父頁面的一個變量,這時判斷該變量,Array == object.constructor;會返回false;
緣由:
一、array屬於引用型數據,在傳遞過程當中,僅僅是引用地址的傳遞。
二、每一個頁面的Array原生對象所引用的地址是不同的,在子頁面聲明的array,所對應的構造函數,是子頁面的Array對象;父頁面來進行判斷,使用的Array並不等於子頁面的Array;切記,否則很難跟蹤問題!
/*********************************************************/
補充jquery判斷js數據類型
$.isArray([1,2]); // 數組 $.isFunction(function () { }); // 函數function $.isEmptyObject(null); // null,undefind $.isXMLDoc(); // xml typeof (2) === "number"; // 數字 typeof ("2") === "string"; // 字符串 typeof (true) === "boolean";// bool型 typeof (function () { }) === "function";// 函數function