javascript 关于类型判断的不同方法 和性能的 思考.

.目前 主流的判断方式 是
var obj='franky';
return Object.prototype.toString.call(obj)=='object String';
这种方式..不得不说 这种方式很优秀 除了代码量比较多一些... 但是它在 非ie浏览器中的性能表现十分优秀...
有些朋友可能会奇怪 这个不是专门判断是不是 Array的么. 考虑到typeof 返回 object  以及 iframe new Window()  等其他window.Array!= 当前窗体的Array 这一情况. 那么String类型为什么也要用这个呢? 直接typeof 不也可以么? 答案是否定的.  typeof new String('franky') =='object' 而不是我们期望的 string..

那么现在我们看看 另外一种判断方式. 这个方式 是我一直使用的方式. 虽然我已经打算放弃它..原因后面说.
以前我用return obj!=null && obj.constructor==String.toString();
后来改成return obj!=null && obj.constructor.toString()==String.toString();
因为 系统自动调用constructor.valueOf() 的性能不如直接给.toString()
这种判断方法 我以前想当然的认为 没有 Object.prototype 没有call 应该性能高些 .而事实上在ie中也确实是这样的
ie6 ie7 ie8 都是这样. 确实比 主流方法要快一些.
但是 在非ie浏览器  (做过测试的有 opera9 10,safari 3 4,firefox 3.1 3.5,chrome 1 2)   主流方法 要比 constructor的判断法 块10倍的速度.

这里 就有个取舍的问题.  目前国内的 一些调查表明 90+% 的用户仍然在用ie .   那么我们是为了10%的客户 来考虑性能 还是 为了90%的客户来考虑性能呢?
当然这个调查 也太偏颇 . 还要考虑到 年轻人使用浏览器的比例... 大概用ie的 还是中老年 以及电脑知识匮乏人群 .比较多一些. 那么 优化方面 就要考虑到  站点所对应的主要人群...

我之所以绝对还是选择主流方法 是因为 非ie下 10倍的优势  而ie下的优势 也就是2倍甚至更低(ie版本不同)...的优势...  有些没必要仅仅计较.

那么我的朋友 Nouo 提出 另外一个 判断方式.

对于typeof 有效的 先用typeof 然后再用 主流或constructor方式判断 即
return typeof(obj)=='string' || Object.prototype.toString.call(obj)=='object String';

他的理由是. 一般我们直接判断一个类型的时候 比如 isString(obj)  我们首先期望它是一个 string的情况比较多. 比如 我希望参数是 string而如果不是则抛出异常的情况...  但是 可能我们有时候还是要 做一些类型判断而使用其他逻辑 . 那么 一旦传入的不是 string类型 或 new String()  那么就要多一次判断的时间...
所以这样做 我还是不赞同的.   不过 不得不承认 直接的typeof 是效率之王.. 遗憾的是它总是有这么多缺陷...

通过以上的 几个方法 我们可以得出大致以下几个结论.
1. ie浏览器中访问 obj.constructor的性能还凑合 至少比找Class.prototype.method.call() 要强一点点.
2. 非ie浏览器中访问obj.constructor的 速度十分可悲. 
3. 如果 一个对象和一个值类型做比较运算 能手写调用 toString或valueOf 方法最好直接调用 而不要期待浏览器 自动调用. 性能会有提升.(积少成多...)

那么 到了这里 似乎我们最终 只是抛出一个问题 留给大家. 即 你们的站点  是优先考虑ie还是 不值得为了那一点点 的性能提升 而大废周章 (还要牺牲掉其他浏览器 的相对巨大的性能损耗).  我还是倾向于 后者.....

转载于:https://www.cnblogs.com/_franky/archive/2009/08/17/1547787.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值