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没有返回字符串时,列出的平台上是否有案例?
解决方法
请参阅注释
#1621,#1929和
#2236中涵盖的问题.
简而言之,一些平台有一个bug,其中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
上面列出的额外检查修复了错误.