10

在 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 是否有性能提升?旧浏览器不支持 typeof 吗?

4

2 回答 2

13

嗯,实际上这是因为[[Class]]通过检查来检查更快toString。错误也可能更少,因为 toString 为您提供了确切的 Class ...

检查这个:

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

您可以在此处查看下划线 typeof 与 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/

于 2012-05-01T08:38:40.713 回答
2

drinchev 的回答部分正确。toString 目前在大多数浏览器中使用 typeOf 慢得多。请参阅他发布的使用 typeOf 的测试的第 7 版。两者仍然非常快,因此在大多数情况下,这种性能差异不会很明显,并且权衡比鸭子类型/ typeOf 更好地符合规范。

下划线拉取请求 321(drinchev 列出)对权衡以及他们决定使用 toString 的原因进行了深入讨论。

于 2012-05-23T00:22:42.207 回答