2016-08-08 31 views
7

Die optionale Überschreibung für isFunction(object) in Underscore.js (repo link to definition), lautet wie folgt:Underscore.js, warum verwendet 'isFunction' `|| falsch?

// 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; 
    }; 
} 

Was ich bin verwirrt ist die || false, warum es nach einem String-Vergleich notwendig ist? Da typeof immer eine Zeichenfolge zurückgibt, sollte es keine Mehrdeutigkeit geben?
Der Kommentar besagt, die Überschreibung behebt einige typeof Bugs, gibt es Fälle auf den aufgeführten Plattformen, wenn typeof keine Zeichenfolge zurückgibt?

Antwort

6

Siehe die Probleme in den Kommentaren, #1621, #1929 und #2236.

Kurz gesagt, einige Plattformen haben einen Fehler, typeof ist keine Zeichenfolge, es sei denn, Sie speichern sie in einer Variablen.
Die || false behebt das Problem, ohne eine zusätzliche Variable einzuführen.

direkt Entnommen #1621:

In IE8 mit einer variablen alles wie erwartet funktioniert:

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

aber ohne ein, die Dinge anders:

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

Die zusätzliche Überprüfung skizzierte oben behebt den Fehler.