相关代码如下:
// 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()
将返回函数
是否有我遗漏的用例。
在这种情况下,typeof 应该更快并且同样准确。
最佳答案
更快,是的,但事实证明它在实践中不太准确。
虽然typeof obj === 'function'
在大多数情况下工作,一些浏览器在边缘情况下会做奇怪的事情,特别是对于 native 对象。 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
简单地说是行不通的。
关于javascript - 为什么下划线不使用 typeof 来检测函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26721925/