javascript – 为什么UnderscoreJS使用toString.call()而不是typeof?

看看在UnderscoreJS的引擎盖下,我看到:
_.isFunction = function(obj) {
    return toString.call(obj) == '[object Function]';
  };

  _.isstring = function(obj) {
    return toString.call(obj) == '[object String]';
  };

  _.isNumber = function(obj) {
    return toString.call(obj) == '[object Number]';
  };

这似乎是一个奇怪的选择.为什么不用typeof来确定值是字符串,函数还是数字?使用toString有性能增益吗?旧版浏览器不支持类型?

解决方法

实际上这是因为通过使用toString检查来检查[[Class]]是更快的.也可以有更少的错误,因为toString给你确切的类…

检查:

var fn = function() { 
    console.log(typeof(arguments)) // returns object
    console.log(arguments.toString()) // returns object Arguments
}

您可以在这里看到下划线类型vs toString的基准:

http://jsperf.com/underscore-js-istype-alternatives

还有一些github问题,更好的解释:

https://github.com/documentcloud/underscore/pull/332

https://github.com/documentcloud/underscore/pull/321

编辑1:

你也可以检查这篇伟大的文章

http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...