2016-08-08 4 views
7

Underscore.js(repo link to definition)でisFunction(object)ためのオプションのオーバーライドは、読み取りますUnderscore.js、なぜisFunction`が `||を使用しますか?偽?次のように

// 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が文字列を返さない場合、リストされているプラ​​ットフォームに問題がありますか?

答えて

6

コメントに記載されている問題、#1621#1929および#2236を参照してください。

すぐに言えば、変数に格納しない限り、typeofは文字列ではないバグがあります。
|| falseは、余分な変数を導入することなく問題を修正します。

#1621から直接取得:予想通りの変数すべての作品で、

IE8では

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

が、1つせず、物事が異なっている:

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

余分なチェックが概説上記のバグが修正されました。

関連する問題