Underscore.js,为什么`isFunction`使用`|| FALSE`?

时间:2016-08-08 10:44:48

标签: javascript underscore.js

Underscore.js(repo link to definition)中isFunction(object)的可选覆盖,内容如下:

// Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
// IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
var nodelist = root.document && root.document.childNodes;
if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    _.isFunction = function(obj) {
        return typeof obj == 'function' || false;
    };
}

我感到困惑的是|| false,为什么在字符串比较后需要它?由于typeof总是返回一个字符串,所以不应该有歧义吗? 注释指出覆盖修复了一些typeof错误,当typeof没有返回字符串时,列出的平台上是否存在这种情况?

1 个答案:

答案 0 :(得分:6)

请参阅评论中涵盖的问题#1621#1929#2236

简而言之,某些平台存在一个错误,typeof不是字符串,除非您将其存储在变量中。
|| false修复了问题而没有引入额外的变量。

直接来自#1621

在IE8中,变量一切都按预期工作:

var t = typeof obj
t === 'function' // false
t === 'object' // true

但没有一个,情况就不同了:

(typeof obj) === 'function' // true, but SHOULD be false
(typeof obj) === 'object' // true

上面列出的额外检查修复了错误。