javascript - 为什么下划线不使用 typeof 来检测函数?

标签 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()

将返回函数

是否有我遗漏的用例。

在这种情况下,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/

相关文章:

Javascript(下划线),更改 javascript 对象的函数

javascript - 为什么 qTip 工具提示不保持打开状态以便我可以单击它的链接?

javascript - 如何在同一页面的多个位置使用同一个 React 应用程序?

javascript - 缓存后淡入高分辨率图像

javascript - 如何使用 Web Speech API 添加语音

javascript - 如果对象包含 JavaScript 中的字母,如何返回对象

javascript - 如何使用下划线js链接函数

javascript - 在Lodash.js/Underscore.js 中,如何为每个元素添加索引?

javascript - each() 函数未在 this.collection 上定义

javascript - 对象数组与 Lodash 深度对比