Was ist der Unterschied zwischen window.location = und window.location.replace ()?


273

Gibt es einen Unterschied zwischen diesen beiden Zeilen?

var url = "http://www.google.com/";
window.location = url;
window.location.replace(url);

3
Ich habe dies auch hier erklärt: stackoverflow.com/questions/846954/…
Mathias Bynens

Antworten:


408

window.location Fügt Ihrem Verlauf ein Element hinzu, indem Sie auf "Zurück" klicken können (oder sollten) und zur aktuellen Seite zurückkehren können.

window.location.replace Ersetzt das aktuelle Verlaufselement, sodass Sie nicht mehr darauf zurückgreifen können.

Siehe window.location:

assign(url): Laden Sie das Dokument unter der angegebenen URL.

replace(url): Ersetzen Sie das aktuelle Dokument durch das unter der angegebenen URL. Der Unterschied zur assign()Methode besteht darin, dass nach der Verwendung replace()der aktuellen Seite nicht im Sitzungsverlauf gespeichert wird, was bedeutet, dass der Benutzer nicht mit der Schaltfläche Zurück zu dieser navigieren kann.

Oh und allgemein gesagt:

window.location.href = url;

wird bevorzugt gegenüber:

window.location = url;

52
Warum sollte window.location.hrefman es vorziehen window.location?
Mathias Bynens


1
Frage - Wenn ich verwende, window.location.replace(URL)wo die URL genau mit der aktuellen übereinstimmt, kann ich damit rechnen, dass sie aktualisiert / neu geladen wird, oder kann sie nichts tun?
user9645

11

TLDR;

verwenden location.hrefoder besser verwenden window.location.href;

Wenn Sie dies jedoch lesen, erhalten Sie unbestreitbare Beweise.

Die Wahrheit ist, dass es in Ordnung ist, aber warum Dinge tun, die fragwürdig sind. Sie sollten die höhere Straße nehmen und es einfach so machen, wie es wahrscheinlich sein sollte.

location = "#/mypath/otherside"
var sections = location.split('/')

Dieser Code ist in Bezug auf Syntax, Logik und Typ vollkommen korrekt. Wissen Sie, dass das einzige, was daran falsch ist?

es hat locationstattlocation.href

was ist damit?

var mystring = location = "#/some/spa/route"

Was ist der Wert von mystring? Weiß jemand wirklich, ohne einen Test zu machen? Niemand weiß, was genau hier passieren wird. Zur Hölle, ich habe das gerade geschrieben und weiß nicht einmal, was es tut. locationist ein Objekt, aber ich weise eine Zeichenfolge zu. Wird es die Zeichenfolge oder das Standortobjekt übergeben? Nehmen wir an, es gibt eine Antwort darauf, wie dies umgesetzt werden sollte. Können Sie garantieren, dass alle Browser dasselbe tun?

Dies kann ich so ziemlich erraten, dass alle Browser das gleiche behandeln.

var mystring = location.href = "#/some/spa/route"

Was ist, wenn Sie dies in Typoskript einfügen, wird es kaputt gehen, weil der Typ-Compiler sagt, dass dies ein Objekt sein soll?

Dieses Gespräch ist jedoch so viel tiefer als nur das locationObjekt. Worum geht es bei dieser Konvertierung, was für ein Programmierer Sie sein möchten?

Wenn Sie diese Abkürzung nehmen, könnte es heute in Ordnung sein, morgen könnte es in Ordnung sein, verdammt, es könnte für immer in Ordnung sein, aber Sie, Sir, sind jetzt ein schlechter Programmierer. Es wird nicht in Ordnung für dich sein und es wird dich im Stich lassen.

Es wird mehr Objekte geben. Es wird eine neue Syntax geben.

Sie könnten einen Getter definieren, der nur eine Zeichenfolge akzeptiert, aber ein Objekt zurückgibt, und das Schlimmste ist, dass Sie denken, dass Sie etwas richtig machen. Sie könnten denken, dass Sie für diese clevere Methode brillant sind, weil die Leute hier Sie schändlich in die Irre geführt haben.

var Person.name = {first:"John":last:"Doe"}
console.log(Person.name) // "John Doe"

Mit Getter und Setter würde dieser Code tatsächlich funktionieren, aber nur weil er gemacht werden kann, heißt das nicht, dass es 'WISE' ist, dies zu tun.

Die meisten Leute, die programmieren, lieben es zu programmieren und besser zu werden. In den letzten Jahren bin ich ziemlich gut geworden und habe viel gelernt. Das Wichtigste, was ich jetzt weiß, besonders wenn Sie Bibliotheken schreiben, ist Konsistenz und Vorhersehbarkeit.

Tun Sie die Dinge, die Sie konsequent tun können.

+"2"<- Dies hier analysiert die Zeichenfolge zu einer Zahl. solltest du es benutzen oder solltest du verwenden parseInt("2")?

was ist mit var num =+"2"?

Von dem, was du gelernt hast, von den Köpfen des Stackoverflow bin ich nicht zu hoffnungsvoll.

Wenn Sie anfangen, diesen 2 Wörtern konsistent und vorhersehbar zu folgen. Sie kennen die richtige Antwort auf eine Vielzahl von Fragen zum Stackoverflow.

Lassen Sie mich Ihnen zeigen, wie sich das auszahlt. Normalerweise setze ich ;in jede Zeile Javascript, die ich schreibe. Ich weiß, dass es ausdrucksvoller ist. Ich weiß, dass es klarer ist. Ich habe meine Regeln befolgt. Eines Tages entschied ich mich dagegen. Warum? Weil mir so viele Leute sagen, dass es nicht mehr benötigt wird und JavaScript darauf verzichten kann. Also, was ich beschlossen habe, dies zu tun. Jetzt, da ich mir als Programmierer sicher bin (da Sie die Früchte des Erlernens einer Sprache genießen sollten), habe ich etwas sehr Einfaches geschrieben und es nicht überprüft. Ich habe ein Komma gelöscht und dachte nicht, dass ich es erneut testen müsste, um ein so einfaches Komma zu entfernen.

Ich habe etwas Ähnliches in es6 und babel geschrieben

var a = "hello world"
(async function(){
  //do work
})()

Dieser Code schlägt fehl und es hat ewig gedauert, ihn herauszufinden. Aus irgendeinem Grund sah es was

var a = "hello world"(async function(){})()

Tief im Quellcode versteckt sagte es mir, dass "Hallo Welt" keine Funktion ist.

Für mehr Spaß zeigt Node nicht die Quellkarten des transpilierten Codes.

Verschwendete so viel dumme Zeit. Ich habe auch jemandem vorgestellt, wie brillant ES6 ist, und dann musste ich mit dem Debuggen beginnen und zeigen, wie kopfschmerzfrei und besser ES6 ist. Nicht überzeugend ist es.

Ich hoffe das hat deine Frage beantwortet. Da dies eine alte Frage ist, ist es mehr für die zukünftige Generation, Menschen, die noch lernen.

Frage, wenn Leute sagen, dass es egal ist, wie es funktioniert. Die Chancen stehen gut, dass eine klügere, erfahrenere Person Ihnen etwas anderes sagt.

Was ist, wenn jemand das Standortobjekt überschreibt? Sie werden einen Shim für ältere Browser machen. Es wird eine neue Funktion erhalten, die angepasst werden muss, und Ihr 3 Jahre alter Code schlägt fehl.

Meine letzte Notiz zum Nachdenken.

Das Schreiben von sauberem, klarem und zielgerichtetem Code bewirkt etwas für Ihren Code, das nicht mit richtig oder falsch beantwortet werden kann. Es macht Ihren Code zu einem Enabler.

Sie können mehr Dinge Plugins, Bibliotheken ohne Angst vor Unterbrechungen zwischen den Codes verwenden.

für die Aufzeichnung. verwenden

window.location.href


24
Lange informative Antwort, leidenschaftlich argumentiert. Aber als Sie für die Verwendung von window.location.hrefover argumentierten window.location, vergaßen Sie, dass die Frage tatsächlich nach dem Unterschied zwischen diesen undwindow.location.replace()
AntonChanning

10
Jedes Mal, wenn ich TLDR sehe, erwarte ich eine kürzere Antwort, keine, die 5x länger ist.
user9645

3
TLDR; use location.href or better use window.location.href; Der TLDR ist diese Zeile. Der Rest ist die "Antwort".
Elysiumplain

Ich glaube nicht, dass Sie einen gültigen Punkt machen, indem Sie einen ungewöhnlichen Anwendungsfall einführen. dh mystring = location.href = "#/some/spa/route". Außerdem würden viele Sprachen (implizite) Typumwandlungen in irgendeiner Weise zulassen. Am Ende des Tages ist Javascript eine dynamische typisierte Sprache, setzen Sie Typkonzepte darauf und sagen Sie, dass es nicht gut ist, macht keinen Sinn.
Apfel Apfel

1
Was passiert , wenn jemand den Standort Objekt überschreibt . Nun , genau wie zu sagen, was ist, wenn jemand überschreibt consoleoder schattiert window- Jetzt haben Sie ein größeres Problem.
Apfel Apfel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.