詳解js類型判斷
js類型轉(zhuǎn)換中typeof會將null也識別為object, 而且返回的類型比少,我們用Object.prototype.toString來實現(xiàn)
第一版
function isArray(value){
return Object.prototype.toString.call(value) === "[object Array]";
}
function isFunction(value){
return Object.prototype.toString.call(value) === "[object Function]";
}
但是這樣寫,一個個去判斷數(shù)組,函數(shù),對象的話很麻煩,比較過程化
第二版
我們想用type(obj)的方式返回對應(yīng)的類型字符串,因為typeof是小寫,所以我們也返回小寫的標準
function type(obj){
// -1 代表截止到倒數(shù)一位
return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase()
}
type([]) // "array"
但是這樣每次都需要對判斷的類型進行slice和toLowerCase也是比較耗性能的, 而且判斷類型只有幾種,所以我們可以用對象提前將可能的結(jié)果緩存起來
第三版
//將types放外面 而不是放在type函數(shù)里面, 利用閉包,優(yōu)化性能,不用每次判斷都聲明一次typess
var types = {
'[object Function]': 'function',
'[object Number]': 'number',
...
}
function type(obj) {
var str = Object.prototype.toString.call(obj)
return types[str]
}
當然上面的types我們還可以這樣優(yōu)化
// 參考自jquery源碼
var types = {}
當然也可以直接用數(shù)組存儲
"Boolean Number String Function Array Date RegExp Object Error".split(" ").forEach(function(e,i){
types [ "[object " + e + "]" ] = e.toLowerCase();
}) ;
判斷window對象
利用window對象的window屬性等于自身
function isWindow( obj ) {
// obj !== undefined 是為了防止沒傳參數(shù)的時候后面報錯
// Uncaught TypeError: Cannot read property 'window' of undefined的錯誤
return obj !== undefined && obj === obj.window;
}
判斷是不是dom元素
isElement = function(obj) {
return !!(obj && obj.nodeType === 1);
}
相關(guān)文章
詳解javascript中var與ES6規(guī)范中l(wèi)et、const區(qū)別與用法
es6剛流行那會,我只知道var即將退出歷史舞臺,取而代之的是let和const,卻不知道var有什么缺陷,為什么會被取代。今天在網(wǎng)上看到一段視頻,解答了我的疑惑2020-01-01
JavaScript SetInterval與setTimeout使用方法詳解
本文講解了JavaScript SetInterval與setTimeout的區(qū)別,并用代碼示例演示了使用方法2013-11-11
JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之鏈表
鏈表就是線性表中針對順序存儲結(jié)構(gòu)的一種優(yōu)化手段,但是在javascript語言中由于數(shù)組的特殊性(自動更新引用位置),所以我們可以采用對象的方式做鏈表存儲的結(jié)構(gòu)2016-01-01
JavaScript window.setTimeout() 的詳細用法
JavaScript window.setTimeout() 的詳細用法,需要的朋友可以參考下。2009-11-11
分享javascript實現(xiàn)的冒泡排序代碼并優(yōu)化
本文給大家匯總介紹了幾個個人收藏的JavaScript實現(xiàn)冒泡排序的代碼,都是非常的不錯,有需要的小伙伴可以參考下2016-06-06

