看看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/