以下是相关代码:
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
_['is' + name] = function(obj) {
return toString.call(obj) === '[object ' + name + ']';
};
});
我可以理解为什么在其他情况下使用toString,但是
typeof function(){}
和
typeof new Function()
将返回function
是否有我遗漏的用例。
在这种情况下,typeof应该更快,同样准确。
答案 0 :(得分:3)
更快,是的,但实际上并非完全准确。
虽然typeof obj === 'function'
适用于大多数案例,但某些浏览器在边缘情况下会做一些奇怪的事情,特别是对于本机对象。 There are a few questions here that go over some of the more bizarre cases(而且他们真的非常奇怪,但他们会在那里):像包含来自插件等对象的元素之类的东西。最终的结果是有很少的对象/浏览器组合在某些情况下会出现这种错误:当使用typeof
时,他们要么在他们不应该检测到的时候检测到它们,或者他们不应该时检测到功能。
对于大多数代码而言,这并不重要。就像我说的那样,我们在这里讨论边缘情况。但像Underscore这样的图书馆在边缘情况下却无法承受错误:他们需要确保在每种情况下都能做到正确,即使浏览器出错也是如此。无论出于何种原因,即使是typeof
错误的浏览器似乎也都是正确的Object.prototype.toString(obj)
。 所以Underscore使用这个技巧,因为它是迄今为止最简单的方法。它也与Array
这样的情况完全吻合,你必须使用这种方法,因为typeof
只是简单无法工作。
答案 1 :(得分:1)
Underscore使用一致的方法,以避免微观优化并提高可读性和可压缩性。
除非_.isFunction
是实际代码中的实际瓶颈,否则在几微秒内以不同方式处理_.isFunction
是没有意义的。