看看在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有性能增益吗?旧版浏览器不支持类型?
解决方法
实际上这是因为通过使用toString检查来检查[[Class]]是更快的.也可以有更少的错误,因为toString给你确切的类…
检查:
var fn = function() { console.log(typeof(arguments)) // returns object console.log(arguments.toString()) // returns object Arguments }
您可以在这里看到下划线类型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/