location.href-Eigenschaft vs. location.assign () -Methode

75

Gibt es einen besonderen Vor- / Nachteil beim JavaScript-Speicherverbrauch zwischen der Verwendung location.href = urlim Gegensatz zu location.assign(url)?

Ich frage mich wohl, ob der Zugriff auf die Methode mehr Speicher benötigt als das Festlegen der Eigenschaft.

Doug Weaver
quelle
1
stackoverflow.com/a/1865840/638649 Antwort kann sein, was Sie
suchen
@JuanMendes: Ich habe eine Intranet-App geerbt, die auf einem <Frameset> basiert, das leckt, als wäre es aus Papier (eine Rate von ca. 50 MB pro Stunde). Ich versuche, Speicher zu sparen, wo immer ich kann.
Doug Weaver
1
Ich denke, die Frage ist dann nicht, wie viel Speicher verwendet wird, sondern ob es ein Leck gibt, das mit der Verwendung von location.assignundlocation.href = ''
Juan Mendes
6
Zukünftige Leser: Ich würde Folgendes stark berücksichtigen: 1. location.hrefvs location.assign()wirkt sich nicht auf die Leistung aus, es sei denn, Ihre App wechselt hunderte Male pro Sekunde den Standort. und 2. wenn Ihre Anwendung ist , das zu tun, das ist das eigentliche Problem , das Sie beheben müssen .
Jordan Gray
1
Was Jordan Gray gesagt hat. Wenn Sie dies nicht obszön oft tun (welcher Anwendungsfall könnte dies möglicherweise erfordern?), Konzentrieren Sie sich auf die Leistung, wenn Sie dies absolut nicht sollten.
J. Munson

Antworten:

30

Ich habe immer benutzt und hatte nie Probleme mit:

location.href = url;

Das Aufrufen einer Funktion sollte etwas langsamer sein als der Zugriff auf die Eigenschaft, aber in Bezug auf den Speicher sollte es meiner bescheidenen Meinung nach keinen großen Unterschied geben.

Tobias Krogh
quelle
Funktioniert bei mir. Ich dachte nicht, dass ich viel sparen würde, aber ich wusste nicht, ob es etwas gab, das ich übersah. Vielen Dank.
Doug Weaver
6
Falsch ! Selbst wenn es einen Unterschied geben könnte, ist die Sache, dass, wenn 'href' eine Eigenschaft ist, document.location nicht ist (es gibt ein get / set darunter). Zweitens sprechen wir nur über µS, vielleicht weniger. Drittens assign()scheint die Verwendung je nach Kontext viel testbarer zu sein als das Zuweisen href(zumindest mit jsdom). Und schließlich scheint das Aufrufen assign()etwas langsamer zu sein . Jsperf.com/location-href-vs-location-assign/14 .
Jerome
1
@ Jerome stimmte zu, dass es besser zu verwenden ist, locaiton.assign()weil es testbar ist. Das Zuweisen location.hreffühlte sich nie richtig an.
Silvenon
41

Ich persönlich bevorzuge es, stattdessen die Funktion aufzurufen, da ich durch den Aufruf einer Funktion einen besseren Eindruck davon bekomme, dass etwas ausgeführt wird und dies nicht nur ein Wert einer Variablen ist, die sich ändert.

Aber wahrscheinlich ja, es kann wahr sein, dass location.href = url;es schneller ist als location.assign(url), obwohl es von der Implementierung der JavaScript-Engine abhängt, siehe den Test, den ich gerade erstellt habe .

Pere
quelle
1
Ich habe gerade Ihren Test überprüft und es scheint, als wäre location.href in Chrome bis zu 1,5-mal schneller.
Sertsedat
29

Ich weiß, dass dies alt ist, aber ich bin darauf gestoßen, als ich nach einer Möglichkeit gesucht habe, zu überprüfen, ob meine Unit-Tests zur richtigen URL umgeleitet wurden.

Ich würde mitgehen, window.location.assign()wenn Sie mehr mit dem Testen beschäftigt sind. Mit einer Funktion können Sie diese Funktion verspotten und die URL-Eingabeparameter überprüfen.

Also, mit Scherz:

window.location.assign = jest.fn();

myUrlUpdateFunction();

expect(window.location.assign).toBeCalledWith('http://my.url');

// Clean up :)
window.location.assign.mockRestore();
kieranroneill
quelle
4
Beachten Sie, dass der mockRestore()Aufruf hier die ursprüngliche native Funktion nicht wiederherstellt. Um es richtig zu machen, müssten Sie die jest.spyOn()Funktion - jestjs.io/docs/en/jest-object#jestspyonobject-methodname
Johny
5

Gibt es einen besonderen Vor- / Nachteil beim JavaScript-Speicherverbrauch zwischen der Verwendung von location.href = url im Gegensatz zu location.assign (url)?

NEIN

Es gibt genau null Differenz.

Der Grund dafür ist einfach. Jedes Mal, wenn Ihr Browser eine neue Seite lädt, startet er eine neue Javascript-VM mit den Skripten für diese Seite, die in dieser VM ausgeführt werden. Wenn Sie eine der Anweisungen in Ihrer Frage ausführen, weisen Sie den Browser an, eine neue Seite zu laden. Dies bedeutet, dass die aktuelle VM zerstört wird (und der damit verbundene Speicher freigegeben wird) und eine vollständig neue VM für die neue Seite geladen wird.

Außer bei seltsamen Browserfehlern ist der Nettoeffekt immer der gleiche. Ihre Skripte werden in einer brandneuen VM mit genau demselben Speicherverbrauch ausgeführt.

Ulokation

Wenn Sie mit dem Standortobjekt im Browser arbeiten und diesen Code auf Node JS ausführen möchten (z. B. zum Testen oder für isometrischen Code), können Sie ulocationeine universelle / isometrische Implementierung des Standortobjekts verwenden. Vollständige Offenlegung: Ich bin der Autor dieses Pakets.

Stijn de Witt
quelle
was ist mit location.assign("#foo")?
Cauterite
Ja, Sie haben Recht, das könnte theoretisch die einzige Ausnahme sein. Höchstwahrscheinlich wird jedoch derselbe Code tatsächlich unter der Oberfläche verwendet, unabhängig davon, ob Sie location.assign aufrufen oder der Eigenschaft zuweisen. Der Eigenschaftssetzer ruft höchstwahrscheinlich einfach zuweisen auf. So würde ich es bauen. :)
Stijn de Witt
3

Testete meinen Computer / Browser http://jsperf.com/location-href-vs-location-assign/2 auf Chrome 40.0.2214.93 32-Bit unter Windows Server 2008 R2 / 7 64-Bit

location.assign war 15% langsamer als location.href.

Musoderelict
quelle
94
Ja, was Sie in einer Web-App ständig tun, ist 500-mal pro Sekunde zu einem neuen Ort zu navigieren. Deshalb sollten Sie die Leistung berücksichtigen.
Meandre