Javascript 为什么';是否使用typeof检测函数?
以下是相关代码:Javascript 为什么';是否使用typeof检测函数?,javascript,underscore.js,Javascript,Underscore.js,以下是相关代码: // 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) {
// 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应该更快、更准确。下划线使用一致的方法,以避免微观优化,提高可读性和可压缩性
为了几微秒而不同地处理
.isFunction
是没有意义的,除非.isFunction
是实际代码中的实际瓶颈。下划线使用一致的方法,以避免微观优化并提高可读性和可压缩性
为了几微秒的时间而对
.isFunction
进行不同的处理是没有意义的,除非.isFunction
是实际代码中的一个实际瓶颈。更快,是的,但在实践中它并不那么准确。
尽管在大多数情况下,typeof obj===“function”
都能正常工作,一些浏览器在边缘情况下会做一些奇怪的事情,尤其是在本机对象上。(它们真的很奇怪,但它们确实存在):比如包含插件对象的元素等等。最终的结果是,很少有对象/浏览器组合会在几种情况下出错:当使用typeof
时,它们要么在不应该检测时检测为函数,要么在应该检测时不检测为函数
对于大多数代码来说,这并不重要。就像我说的,我们这里讨论的是边缘案例。但是像下划线这样的库在边缘情况下不能出错:它们需要确保在任何情况下都正确,即使浏览器出错。不管出于什么原因,即使浏览器的
typeof
错误,它们似乎都得到了Object.prototype.toString(obj)
正确的结果所以下划线使用了这个技巧,因为它是最简单的方法,在任何地方都适用。它还与Array
这样的情况很好地吻合,在这种情况下,您必须使用这种方法,因为typeof
只是简单地不起作用。是的,速度更快,但在实践中却不太准确。
尽管在大多数情况下,typeof obj===“function”
都能正常工作,一些浏览器在边缘情况下会做一些奇怪的事情,尤其是在本机对象上。(它们真的很奇怪,但它们确实存在):比如包含插件对象的元素等等。最终的结果是,很少有对象/浏览器组合会在几种情况下出错:当使用typeof
时,它们要么在不应该检测时检测为函数,要么在应该检测时不检测为函数
对于大多数代码来说,这并不重要。就像我说的,我们这里讨论的是边缘案例。但是像下划线这样的库在边缘情况下不能出错:它们需要确保在任何情况下都正确,即使浏览器出错。不管出于什么原因,即使浏览器的
typeof
错误,它们似乎都得到了Object.prototype.toString(obj)
正确的结果所以下划线使用了这个技巧,因为它是最简单的方法,在任何地方都适用。它还与Array
等情况很好地吻合,在这些情况下,您必须使用此方法,因为typeof
只是简单的不起作用。下划线不一定以速度为目标。在这种情况下,只需将函数
名称添加到类型列表中就更简单了。当typeof
应用于RegExp对象和一些主机对象时,一些旧浏览器中存在错误,错误地返回“Function”
是一个根据类型划分的对象,分数不一定以速度为目标。在这种情况下,只需将函数
名称添加到类型列表中就更简单了。当typeof
应用于RegExp对象和一些主机对象时,一些旧浏览器中存在错误,错误地返回“Function”
是一个根据typeofwhat关于前面提到并删除的框架问题的对象,这是无效的吗?@www.arcmarks.com,删除(不正确的)答案是有原因的。因此,我认为答案更多,因此在某些正则表达式浏览器中会失败。这与array和null的错误行为模式相匹配。那么前面提到并删除的框架问题呢?这是无效的吗?@www.arcmarks.com,删除(不正确的)答案是有原因的。因此,我认为答案更多,因此在某些正则表达式浏览器中会失败。这也符合数组和null的错误行为模式。
typeof new Function()