網頁特效 typeof資料類型檢測函數
Javascript是一種弱類型指令碼語言,弱類型並不代表沒有類型。和其他的程式設計語言一樣,Javascript中的資料也是有類型的,大的可以分為簡單類型與複雜類型。
簡單類型有 number,string,boolean
複雜類型有object和 function
下邊的例子可以說明:
typeof 1 //echo "number"
typeof 1.1 //echo "number"
typeof "hello" //echo "string"
typeof true //echo "boolean"
typeof new Object() // echo "object"
typeof new Date() //echo "object"
typeof new Array() //echo "object"
typeof new Function() //echo "function"
typeof Object //echo "function"
typeof Date //echo "function"
typeof Array //echo "function"
typeof Function //echo "function"
上邊的代碼我們大致可以看出,使用typeof函數可以得出的Javascript資料類型有哪些,複雜類型只有object和function,而簡單類型也只有三種。其實這並不準確,不論複雜類型還是簡單類型,使用typeof得出的都不完全,下邊我們將詳細點描述。
對於簡單類型,”number”可以分為integer和float兩種,這兩種類型在計算乘除的時候,是不一樣的,這句有點廢話,其實我想說的是,float類型在和int類型計算的時候,會有許多莫名奇妙的問題,就是因為float的精度問題。而對於複雜類型,就相對複雜些,javascript內建的一些類型從上邊的例子我們可以看到,常見的有Date,Object,Array,Function(應該還有其他的吧,寫這個的時候我想不起來),雖然他們使用typeof 計算時,返回的只有object換個function兩種,但是他們其實是不一樣的,如何不一樣,就無需贅述。但是由上邊的例子我們也可以看出,object和function兩種類型比較特殊,我將他們其稱之為基礎類型。有個簡單的區分方法,通常由new建立的都是object類型,通過function關鍵自訂的都是function類型,但是還有例外,就是new Function,它所建立的就是一個function,這個可能會在以後將函數的定義時提到吧。object類型,大致都能差不多理解,容易讓人疑惑的是function類型,作為一種類型來描述時,其實應該描述為大寫Function。Function本身的類型就是Function,由Function類型建立(包括使用function關鍵字定義)出來的function(函數)類型也是Function。這句話需要仔細理解。但是,還有一點,定義的function也是可以執行個體化的(這個詞用這兒可能不太合適,不過便於理解),如下所示:
function functionType()
{
//echo I am a function
}
var func = new functionType();
我們分別再使用typeof來檢查functionType和func的類型:
typeof functionType // echo "function"
typeof func // echo "object"
再揣摩上邊的話,定義的function的類型也是Function,定義的function同樣可以被用於執行個體化,就像系統內建的Date,Array等類型一樣,這說明了自訂的function是可以被當做類型使用的,這就找到了一條自訂類型的路,在物件導向的語言中,我們稱之為類。現在在Javascript,我們也有定義類方法,即定義function。同時,類也是對象,類對象的類型是Function。
以上可以看出,Javascript中的複雜類型其實由Date,Array,Object,Function,以及我們自訂的類(型)。
既然存在類型,我們就需要區分類型,我們上邊說了,typeof不能準確區分,因此,我們引入另一個關鍵字instanceof,並不是函數,但是它會返回一個boolean類型的值,標明一個對象是否為另一個對象的執行個體。如下
typeof new Date() instanceof Date //echo true
typeof new Array() instanceof Array //echo true
typeof new Object() instanceof Object //echo true
function myType(){
// this is my type
}
var instance = new myType();
instance instanceof myType() //echo true
myType instanceof Function //echo true
new Date() instanceof myType() // echo false
我們可以看出,instanceof是用來檢查一個對象是否為另一個對象的執行個體的。細心的朋友可能還會這樣嘗試:
Function instanceof Function //echo true
Function instanceof Object //echo true
Object instanceof Object //echo true
Object instanceof Function //true
老實說,這段代碼很讓人抓狂。我在前邊也說過,Object和Function都為基礎類型,我們前邊也看到使用typeof時他們兩個之間的關係,typeof Object結果為function,我個人認為,這說明了Javascript中所有複雜類型的基礎的都是Function,換句話說所有的類型都是基於Function來實現的。另一方面任何對象使用instanceof Object結果都為true,說明了任何對象都是Object的執行個體。前邊一句側重於類型,後邊側重於執行個體(Function我們也可以認為它是自己的一個執行個體)。