別了 JavaScript中的isXX系列
更新時(shí)間:2012年08月01日 22:38:29 作者:
我們很容易被漂亮的代碼吸引,也不知不覺(jué)的在自己的代碼庫(kù)中加入這些。卻沒(méi)有冷靜的想過(guò)它們的優(yōu)劣。這不,我就收集了一系列形如 是否為……? 的判斷的boolean函數(shù)
復(fù)制代碼 代碼如下:
isNull: function(a){
return a === null;
},
isUndefined: function(a){
return a === undefined;
},
isNumber: function(a){
return typeof a === 'number';
},
isString: function(a){
return typeof a === 'string';
},
isBoolean: function(a){
return typeof a === 'boolean';
},
isPrimitive: function(b){
var a = typeof b;
return !!(b === undefined || b === null || a == 'boolean' || a == 'number' || a == 'string');
},
isArray: function(a){
return proto_obj.toString.call(a) === '[object Array]';
},
isFunction: function(a){
return proto_obj.toString.call(a) === '[object Function]';
},
isPlainObject: function(o){
if (!o || o === win || o === doc || o === doc.body) {
return false;
}
return 'isPrototypeOf' in o && proto_obj.toString.call(o) === '[object Object]';
},
isWindow: function(o){
return o && typeof o === 'object' && 'setInterval' in o;
},
isEmptyObject: function(o){
for(var a in o) {
return false;
}
return true;
}
以上isXX系列中,isUndefined在類庫(kù)中用的最多。如判斷是否傳入了某個(gè)參數(shù),判斷對(duì)象是否擁有某個(gè)屬性等等。但這個(gè)函數(shù)是不必存在,我已將其移除。理由如下
1,isUndefined 與 使用全等(===)或typeof 多了一層函數(shù)調(diào)用。很明顯多一層函數(shù)調(diào)用比直接使用原生的運(yùn)算符效率會(huì)低(雖然有些微不足道),但如果isUndefined調(diào)用次數(shù)很多如上萬(wàn)次還是很明顯的。我曾經(jīng)在郵箱框架中加入了該函數(shù),調(diào)用次數(shù)有4000多次,從性能分析工具看占用了近1%的時(shí)間。僅僅一個(gè)判斷占1%的調(diào)用時(shí)間還是很可怕的。當(dāng)然,郵箱框架內(nèi)的isUndefined處在多層閉包的頂層,訪問(wèn)其也會(huì)占用較多時(shí)間。如果這一條還不足以讓你放棄isUndefined,請(qǐng)看下面。
2,函數(shù)從一定程度上是對(duì)一些代碼的封裝,抽象。是組織良好代碼的方式之一,且有利于降低代碼的復(fù)雜性。但isNull/isUndefined/isBoolean/isNumber/isString函數(shù)內(nèi)僅有一句,抽象層次很低。因此完全不必封裝而提取出一個(gè)函數(shù)。
3,isUndefined(a) 與 a === undefined相比并不會(huì)節(jié)省幾個(gè)字節(jié)(呵,你可以命名的更短但損失了可讀性)。
綜上,我去掉了類庫(kù)中對(duì)基本類型判斷的isNull/isUndefined/isBoolean/isNumber/isString,需要用到這些判斷的時(shí)候直接使用typeof運(yùn)算符等。
相關(guān)文章
關(guān)于innerHTML后丟失動(dòng)態(tài)綁定的EVENT問(wèn)題解決方法
用innerHTML取出一段內(nèi)容后再innerHTML回去,那么原來(lái)動(dòng)態(tài)綁定的事件就會(huì)丟失,下面與大家分享下解決方法,感興趣的朋友可以參考下哈2013-05-05基于JavaScript實(shí)現(xiàn)移動(dòng)端點(diǎn)擊圖片查看大圖點(diǎn)擊大圖隱藏
最近接了個(gè)項(xiàng)目,項(xiàng)目需求是這樣的,當(dāng)點(diǎn)擊圖片查看圖片,再次點(diǎn)擊大圖被隱藏,在移動(dòng)端用的比較多,因?yàn)橐苿?dòng)端屏幕小,需要查看大圖。具體代碼實(shí)現(xiàn)過(guò)程本文給大家介紹,需要的朋友可以參考下2015-11-11js+html5實(shí)現(xiàn)canvas繪制網(wǎng)頁(yè)時(shí)鐘的方法
這篇文章主要介紹了js+html5實(shí)現(xiàn)canvas繪制網(wǎng)頁(yè)時(shí)鐘的方法,涉及html5圖形繪制的基礎(chǔ)技巧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05使用jscript實(shí)現(xiàn)二進(jìn)制讀寫腳本代碼
Reading And Writing Binary Files Using JScript正如我剛才推什么我能做的JScript中,我想出了對(duì)問(wèn)題的二進(jìn)制文件。以下級(jí)的解決,這為小到中等大小的文件。我的部分包括這個(gè)職位在這里,因?yàn)槲壹磳⒏吨T表決,在一個(gè)職位約發(fā)送帶有附件的電郵通過(guò)JScript和它會(huì)使用這個(gè)二進(jìn)制文件碼來(lái)讀取,在二進(jìn)制附件檔案。2008-06-06javascript Array.prototype.slice使用說(shuō)明
slice 可以用來(lái)獲取數(shù)組片段,它返回新數(shù)組,不會(huì)修改原數(shù)組。2010-10-10mock.js模擬數(shù)據(jù)實(shí)現(xiàn)前后端分離
這篇文章主要為大家詳細(xì)介紹了mock.js模擬數(shù)據(jù)實(shí)現(xiàn)前后端分離,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07