Dokument.Kopf v. Dokument.getElementsByTagName("head")[0]
Was ist der Unterschied zwischen der Verwendung document.head
und mit document.getElementsByTagName("head")[0]
? Tests, die ich lief, zeigte, dass Sie beide in etwa einer Millisekunde.
Habe ich auch gesehen
document.head||document.getElementsByTagName("head")[0];
hätte, führte mich zu glauben, dass document.head
ist schneller und der andere ist mehr kompatibel, außer, dass die tests habe ich widerlegt dies.
Und wenn man kompatibel ist, warum die anderen so gut?
Update: Meine tests falsch waren, wie einige haben darauf hingewiesen.
- Sie können auch
document.querySelector("head")
. Es ist nur eine Frage der Wahl. - Sie ziemlich viel kann nicht schneller als mit einer direkten Referenz. So
document.head
sollte schneller von einer Größenordnung, siehe jsperf.com/document-head-vs-getelementsbytagname - 2019 update: bitte hört auf unnötig zu
|| document.getElementsByTagName("head")[0]
, IE8 ist schon lange tot.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mithilfe der
||
- Betreiber wie, dass ist eine form der feature-Erkennung. Wenn verwendet, wenn der erste Wert nicht definiert ist, sendet es zurück, letzterer Wert.Also für
der Grund dafür ist, dass, wenn
document.head
wird nicht unterstützt zumindest der richtige Wert zurückgegeben wird.Als für Ihre Geschwindigkeit testen, eine Millisekunde ist eine lange Zeit. Ich bezweifle, dass es wirklich sooo lange gedauert. In der Tat, ich habe ein
jsPerf
für diese. Es zeigt, dass diegetElementsByTagName
Funktion ist in etwa 80% langsamer.getElementsByTagName
langsamer wird als die DOM der Größe erhöht. Und1ms
ist ein Zeichen, dass es war schlecht gemessenconsole.time()
im FF...document.querySelector
ist auch langsamer...Laut MDN,
document.head
nur gewann die Unterstützung im IE 9, ist also die andere Methode als fallback schützt Sie vor browser-Inkompatibilitätendocument.getElementsByTagName("head")[0]
kompatibel ist, warum verwendendocument.head
überhaupt?Dies ist eher eine Komfort-Sache als eine Leistung (obwohl
document.head
sollte einen vernachlässigbaren Vorteil). Verwenden Sie was auch immer Sie mögen, oder verwenden Sie eine als Alternative zu den anderen (wie dein Beispiel-code enthält). Mit der fallback ist klug, dadocument.head
wird nicht unterstützt in IE 6-8.Es ist nicht wahrscheinlich, dass
getElementsByTagName
wird bald veraltet sein, so ist dies nicht ein großes Beispiel von, wenn es gut ist, um eine Ausweichlösung. Man könnte sicher die ausführlichere route selbst und genießen Sie support auf in die Zukunft.Bessere Beispiele für diese Art von Dingen wäre, die Ereignisse, und wie Sie übergeben, um in modernen Browsern, im Vergleich zu älteren Browsern. Es ist nicht ungewöhnlich, um zu sehen, so etwas wie dieses:
In diesem Fall, obwohl, die
window.event
Teil ist notwendig für legacy-Unterstützung. Wenn dieevent
Objekt istundefined
übernehmen wir für die Veranstaltung wird ein Mitglied auf diewindow
Objekt. Als Browser Reife,window.event
aufhört zu eine Sache, und diese tests einstimmig zurückevent.target.id
statt.Wieder, dein Fall ist ein bisschen anders als
getElementsByTagName
wird wahrscheinlich nie veraltet oder werden verschwinden, weilwindow.event
haben.head
element tausend mal, Sie haben kein Geschäft in dieser Branche 😉 ich denke, wir können beide einig, dass zwischengespeicherte Referenzen auf DOM-Knoten ist besser als immer wieder Suche Sie. Aber die Geschwindigkeit unterscheidet sich für immer diehead
element ist vernachlässigbar.head
element; nicht - Elemente im Allgemeinen. Klar zwischengespeicherten Verweise sind schneller als die wiederholte Reisen nach DOM. Bitte verwechseln Sie meine position hier, ich bin auf deiner Seite 99% der Zeit.document.body
,document.images
,document.links
etc. die über das gleiche Thema. Ich würde es nicht Wagen, zu empfehlengetElementsByTagName()
, würde ich immer diese verwenden, um Verweise, nicht nur für die Bequemlichkeit, jeden Tag den ganzen Tag.document.images
ist besser als das Crawlen der DOM für mehrere tags. Aber das ist äpfel und Orangen; wir reden überdocument.head
, die craws der DOM (sehr kurz, da es an der Spitze) für ein element.document.head
ist besser, aber nicht mehr reizvoll, weil der einen großen performance-boost (obwohl es technisch bietet einen Schub).Nur Bequemlichkeit, weil Sie sollen nur einen haben pro Seite. Genauso wie es eine direkte Verknüpfung zu
document.body
, obwohldocument.body
ist standard, und Sie würden nicht brauchen, das fallback.Ich würde es nicht verwenden
document.head
es sei denn, Sie nur unterstützen, IE9+. Bis dann, ich würde stick zudocument.getElementsByTagName("head")[0]
Wenn Sie möchten, eine version, die Sie nicht haben, um zu ändern, wie die Zeit vergeht, die Sie tun können, die folgenden an der Spitze des Skripts
Diese Weise können Sie nur ändern, dass ein Ort, wenn Sie die drop-support für den IE8 (oder vielleicht sogar lassen Sie es dort, da es nicht weh tut, aber es wird dead code). Der obige code würde auch sicherstellen, dass Sie nur Abfrage der DOM einmal
document.head||(document.head=document.getElementsByTagName("head")[0]);
wäre das nicht etwas schneller?document.head = document.head || document.getElementsByTagName("head")[0];
wenn Sie Folgen Sie meinem Vorschlag, es passiert nur einmal wie auch immer, ich denke, Sie Spalten Haare, wenn Sie eine echte performance-Frage, stellen Sie eine neue ein