Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么下划线使用toString.call()而不是typeof?_Javascript_Underscore.js - Fatal编程技术网

Javascript 为什么下划线使用toString.call()而不是typeof?

Javascript 为什么下划线使用toString.call()而不是typeof?,javascript,underscore.js,Javascript,Underscore.js,从引擎盖下面看,我看到: _.isFunction = function(obj) { return toString.call(obj) == '[object Function]'; }; _.isString = function(obj) { return toString.call(obj) == '[object String]'; }; _.isNumber = function(obj) { return toString.call

从引擎盖下面看,我看到:

  _.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吗?

事实上,这是因为使用
toString
检查
[[Class]]]
会更快。由于toString为您提供了准确的类,因此错误也可能会减少

选中此项:

var fn = function() { 
    console.log(typeof(arguments)) // returns object
    console.log(arguments.toString()) // returns object Arguments
}
您可以在此处看到下划线typeof vs toString的基准:

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

编辑1:

您也可以查看这篇很棒的文章:


德林切夫的回答部分正确。toString目前比大多数浏览器中使用typeOf慢得多。它使用typeOf。虽然这两种方法都非常快,但在大多数情况下,这种性能差异不会很明显,与duck-typing/typeOf相比,这种折衷方法更符合规范


(drinchev列出的)深入讨论了折衷方案以及他们决定使用toString的原因。

typeof
自1996年1.1版以来一直存在于每一个JavaScript版本中。