typeof() 用于判斷變量的類型,instanceof 用于判斷 變量是否屬于某個對象的實列.
typeof用以獲取一個變量或者表達式的類型,typeof一般只能返回如下幾個結(jié)果:
number,boolean,string,function(函數(shù)),object(NULL,數(shù)組侧戴,對象),undefined。
其中 數(shù)組吸奴,對象和null都是返回一個object
如:
alert(typeof (123));//typeof(123)返回"number"
alert(typeof ("123"));//typeof("123")返回"string"
所以在判斷一個變量是否為數(shù)組時隐绵,可以使用 instanceof 如: a instanceof Array
instanceof用于判斷一個變量是否某個對象的實例,
如var a=new Array(); alert(a instanceof Array);會返回true盲链,
同時alert(a instanceof Object)也會返回true;這是因為Array是object的子類蝇率。
再如:function test(){};var a=new test();alert(a instanceof test)會返回true迟杂。
Object.prototype.toString 返回一種標準格式字符串,所以上例可以通過 slice 截取指定位置的字符串本慕,如下所示:
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call(2) // "[object Number]"
注:這種變化可以從 IE8 和 Firefox 4 中看出區(qū)別排拷,如下所示:
// IE8
Object.prototype.toString.call(null) // "[object Object]"
Object.prototype.toString.call(undefined) // "[object Object]"
// Firefox 4
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
測試為定義變量
typeof foo !== 'undefined'
上面代碼會檢測 foo 是否已經(jīng)定義;如果沒有定義而直接使用會導(dǎo)致 ReferenceError 的異常锅尘。 這是 typeof 唯一有用的地方监氢。
結(jié)論
為了檢測一個對象的類型,強烈推薦使用 Object.prototype.toString 方法藤违; 因為這是唯一一個可依賴的方式浪腐。正如上面表格所示,typeof 的一些返回值在標準文檔中并未定義顿乒, 因此不同的引擎實現(xiàn)可能不同议街。
除非為了檢測一個變量是否已經(jīng)定義,我們應(yīng)盡量避免使用 typeof 操作符璧榄。