为什么不强调使用typeof来检测功能?

时间:2014-11-03 19:47:38

标签: 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) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });

我可以理解为什么在其他情况下使用toString,但是

typeof function(){}

typeof new Function()

将返回function

是否有我遗漏的用例。

在这种情况下,

typeof应该更快,同样准确。

2 个答案:

答案 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是没有意义的。