2014-05-07 5 views
6

zwischen der ersten Codezeile der Suche in minified und unminified JS-Datei des Bootstrap, ist es eine unmittelbare Diskrepanz:Warum konvertieren Javascript Minifier === zu ==?

// bootstrap.js 
if (typeof jQuery === 'undefined') { ... } 

gegen

// bootstrap.min.js 
if("undefined"==typeof jQuery)... 

(überzeugen Sie sich selbst: bootstrap.js und bootstrap.min.js)

Ich bin verwirrt, warum das erlaubt ist. Mein (vielleicht naives) Verständnis ist, dass === immer ein Leistungsgewinn ist und oft unerwartete Ergebnisse verhindert (z. B. falsche Vergleiche mit 0 oder ""). Es scheint, dass die kleinen Zuwächse in der Dateigröße in der Leistung und dem Potenzial für fehlerhafte Ergebnisse verloren gehen. Kann jemand hier Licht geben?

+0

'typeof' gibt immer eine Zeichenkette zurück, daher ist' === 'nicht notwendig. Der Minifier oder ein anderer Prozessor, durch den die Datei durchlaufen wurde, könnte dies erkannt haben. Es gibt kein Potenzial für ein falsches Ergebnis, und selbst wenn diese Linie häufig genug laufen würde, um einen Engpass zu verursachen, würde jeder Leistungsunterschied wegfallen. – user2357112

+0

Jeder antwortet, ohne die Frage vollständig zu verstehen. – ndugger

+5

@NickDugger das ist nicht wahr; Die Frage ist ziemlich klar. Der Leistungsvorteil von '===' ist nur relevant, wenn die Operanden nicht vom selben Typ sind. – Pointy

Antwort

5

In dem bestimmten Code, den Sie zitieren, ist es sicher, da die Typen beider Operanden invariant sind und beide Strings sind. Es sind keine Leistungseinsparungen möglich, da nie eine Art Zwang erforderlich sein wird. Denken Sie an == als so etwas wie dies zu sein:

function ==(a, b) { // obviously this is fake 
    if (a === b) return true; 
    // type coercion ... 
} 

Auch ich persönlich denke, dass ein === über == wegen der semantischen Unterschiede und nicht wegen der Leistung verwendet werden soll. Micro-Optimierungen wie diese sind nicht wichtig für die große Mehrheit des Codes, den die meisten Leute schreiben. (Es ist ein wenig ironisch in der Tat, dass die Überprüfung auf das Vorhandensein von jQuery ist mit einem typeof Vergleich getan, dass ich eine fragwürdigen-wertvolle Mikro-Optimierung ist.) oops, das falsch war :)

+0

Schöne Antwort! Wollte nur für jemand anderen klären, der Probleme beim Lesen des Pseudo-Codes hatte, dass '// Typ Zwang 'das _de facto_' else' ist, keine Beschreibung dessen, was oben passiert. – Impirator

+0

@Impirator oh ja, guter Punkt. Ich habe es so geschrieben, um zu betonen, dass die Arbeit beendet ist, wenn die Werte nach den Regeln des Vergleichs gleich sind. – Pointy

0

typeof wird immer Geben Sie eine Zeichenfolge zurück, damit Sie sich keine Gedanken über die Typkonvertierung machen müssen. Letztendlich spart dies nicht wirklich viel in der Datei oder ihrer Ausführung, aber dies wird als eine sichere Annahme angesehen.