锁定老帖子 主题:别了,JavaScript中的isXX系列
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-16
最后修改:2011-04-16
我们很容易被漂亮的代码吸引,也不知不觉的在自己的代码库中加入这些。却没有冷静的想过它们的优劣。这不,我就收集了一系列形如 “是否为……?” 的判断的boolean函数。
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在类库中用的最多。如判断是否传入了某个参数,判断对象是否拥有某个属性等等。但这个函数是不必存在,我已将其移除。理由如下
1,isUndefined 与 使用全等(===)或typeof 多了一层函数调用。很明显多一层函数调用比直接使用原生的运算符效率会低(虽然有些微不足道),但如果isUndefined调用次数很多如上万次还是很明显的。我曾经在邮箱框架中加入了该函数,调用次数有4000多次,从性能分析工具看占用了近1%的时间。仅仅一个判断占1%的调用时间还是很可怕的。当然,邮箱框架内的isUndefined处在多层闭包的顶层,访问其也会占用较多时间。如果这一条还不足以让你放弃isUndefined,请看下面几条。
2,函数从一定程度上是对一些代码的封装,抽象。是组织良好代码的方式之一,且有利于降低代码的复杂性。但isNull/isUndefined/isBoolean/isNumber/isString函数内仅有一句,抽象层次很低。因此完全不必封装而提取出一个函数。
3,isUndefined(a) 与 a === undefined相比并不会节省几个字节(呵,你可以命名的更短但损失了可读性)。
综上,我去掉了类库中对基本类型判断的isNull/isUndefined/isBoolean/isNumber/isString,需要用到这些判断的时候直接使用typeof运算符等。
你呢?
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-04-16
我也支持这种观点,这不光是在JS里面,在所有的程序编程里面,都应该考虑这个问题,不必要的封装只是让代码量增大,并没有达到程序优化的目的
|
|
返回顶楼 | |
发表时间:2011-04-16
我也支持这个观点!
|
|
返回顶楼 | |
发表时间:2011-04-16
不太支持.单单一层函数调用的开销并没有那么可怕. 如果你已经写了
isArray: function(a){ return proto_obj.toString.call(a) === '[object Array]'; } 保持代码风格的统一也是蛮有必要的. |
|
返回顶楼 | |
发表时间:2011-04-16
最后修改:2011-04-16
不完全支持,如果在性能要求不是很高的地方我还是会用isXXX,代码的可阅读性提高了许多,因为js是解释型语言所以效率和编译语言比肯定会慢一些,如果在程序中很多地方要判断类似 if(null==str && str.trim().length==0)
我倒是觉得一句 StringUtils.isBlank(str) 看起来更舒服些 |
|
返回顶楼 | |
发表时间:2011-04-17
作为基础类库的话,最好还是去掉。
|
|
返回顶楼 | |
发表时间:2011-04-18
这个可以保留吧...
isPrimitive: function(b){ var a = typeof b; return !!(b === undefined || b === null || a == 'boolean' || a == 'number' || a == 'string'); }, |
|
返回顶楼 | |
发表时间:2011-04-18
除了isIE, isFF之类可以保留,其它都基本可以省掉
|
|
返回顶楼 | |
发表时间:2011-04-18
JE帐号 写道 这个可以保留吧...
isPrimitive: function(b){ var a = typeof b; return !!(b === undefined || b === null || a == 'boolean' || a == 'number' || a == 'string'); }, 这个可以保留的,判断是否是JS的基本类型。楼主的意思应该是isUndefined、isNull无需保留。 |
|
返回顶楼 | |
发表时间:2011-04-18
如果访问次数非常多的话就不能用这个了,会很卡,小型的网站,没多少人访问的可以为了简单这样做
|
|
返回顶楼 | |