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版本中。