看看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吗?

最佳答案

嗯,这实际上是因为通过使用[[Class]]来检查toString更快。此外,由于toString为您提供了确切的Class,因此错误的发生率也可能会减少。

检查一下:

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

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

关于javascript - 为什么UnderscoreJS使用toString.call()而不是typeof?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10394929/

10-13 04:26