Czy istnieje różnica między tymi dwiema liniami?
var url = "http://www.google.com/";
window.location = url;
window.location.replace(url);
javascript
window
location
Aaron Digulla
źródło
źródło
href
iassign
: stackoverflow.com/q/2383401/632951 , stackoverflow.com/q/7703689/632951 , stackoverflow.com/q/10302905/632951Odpowiedzi:
window.location
dodaje element do swojej historii, w którym możesz (lub powinnaś móc) kliknąć „Wstecz” i wrócić do bieżącej strony.window.location.replace
zastępuje bieżący element historii, więc nie można do niego wrócić.Zobacz
window.location
:Aha i ogólnie mówiąc:
jest uprzywilejowany:
źródło
window.location.href
być uprzywilejowanywindow.location
?window.location.replace(URL)
użyję adresu URL, który jest dokładnie taki sam, jak bieżący, czy mogę oczekiwać, że odświeży się / przeładuje, czy może nic nie robić?TLDR;
używać
location.href
lub lepiej wykorzystywaćwindow.location.href
;Jednak jeśli to przeczytasz, uzyskasz niezaprzeczalny dowód.
Prawda jest w porządku, ale po co robić rzeczy, które są wątpliwe. Powinieneś wybrać wyższą drogę i po prostu zrobić to tak, jak to prawdopodobnie powinno być zrobione.
Ten kod jest całkowicie poprawny pod względem składniowym, logicznym, typowym, czy wiesz, że jest z nim tylko jedna rzecz?
ma
location
zamiastlocation.href
a co z tym
Jaka jest wartość
mystring
? czy ktoś naprawdę wie bez przeprowadzania jakiegoś testu. Nikt nie wie, co dokładnie się tutaj stanie. Do diabła, właśnie to napisałem i nawet nie wiem, co to robi.location
jest obiektem, ale przypisuję ciąg, czy przejdzie on przez ciąg, czy przekaże obiekt lokalizacji. Powiedzmy, że istnieje odpowiedź na pytanie, w jaki sposób należy to zaimplementować. Czy możesz zagwarantować, że wszystkie przeglądarki zrobią to samo?Mogę zgadnąć, że wszystkie przeglądarki będą działać tak samo.
A jeśli umieścisz to w maszynopisie, czy to się zepsuje, ponieważ kompilator typów powie, że to ma być obiekt?
Ta rozmowa jest jednak o wiele głębsza niż sam
location
przedmiot. Co to za konwersja dotyczy tego, jakim programistą chcesz być?Jeśli skorzystasz z tego skrótu, to może być dziś w porządku, jutro może być w porządku, do diabła, może być w porządku na zawsze, ale pan jest teraz złym programistą. To nie będzie dla ciebie w porządku i zawiedzie cię.
Będzie więcej obiektów. Pojawi się nowa składnia.
Możesz zdefiniować moduł pobierający, który pobiera tylko ciąg znaków, ale zwraca obiekt, a najgorsze jest to, że pomyślisz, że robisz coś poprawnie, możesz pomyśleć, że jesteś genialny w tej sprytnej metodzie, ponieważ ludzie tutaj wstydliwie wprowadzili cię w błąd.
W przypadku programów pobierających i ustawiających ten kod faktycznie działałby, ale sam fakt, że można to zrobić, nie oznacza, że jest to „WISE”.
Większość ludzi, którzy programują, uwielbia programować i uwielbia się poprawiać. W ciągu ostatnich kilku lat stałem się całkiem dobry i wiele się nauczyłem. Najważniejszą rzeczą, którą wiem teraz, szczególnie podczas pisania Bibliotek, jest spójność i przewidywalność.
Rób rzeczy, które możesz konsekwentnie robić.
+"2"
<- to tutaj parsuje ciąg do liczby. powinieneś go użyć? czy powinieneś użyćparseInt("2")
?co
var num =+"2"
?Z tego, czego się nauczyłeś, z umysłów stackoverflow nie mam nadziei.
Jeśli zaczniesz przestrzegać tych 2 słów spójnych i przewidywalnych. Poznasz prawidłową odpowiedź na mnóstwo pytań dotyczących przepływu stosu.
Pokażę ci, jak to się opłaca. Zwykle umieszczam
;
na każdej linii javascript, którą piszę. Wiem, że to bardziej ekspresyjne. Wiem, że to bardziej jasne. Przestrzegałem moich zasad. Pewnego dnia postanowiłem tego nie robić. Czemu? Ponieważ tak wiele osób mówi mi, że nie jest to już potrzebne, a JavaScript może się bez niego obejść. Więc co postanowiłem to zrobić. Teraz, ponieważ nabrałem pewności siebie jako programisty (ponieważ powinieneś cieszyć się owocem opanowania języka), napisałem coś bardzo prostego i nie sprawdziłem tego. Usunąłem jeden przecinek i nie sądziłem, że muszę ponownie testować tak prostą rzecz jak usunięcie jednego przecinka.Napisałem coś podobnego do tego w es6 i babel
Ten kod zawiódł i zajęło to wieczność. Z jakiegoś powodu to, co zobaczył
ukryty głęboko w kodzie źródłowym mówił mi, że „witaj świecie” nie jest funkcją.
Dla większej zabawy węzeł nie pokazuje map źródłowych transpilowanego kodu.
Zmarnowałem tyle głupiego czasu. Przedstawiłem komuś także, jak ES6 jest genialny, a potem musiałem zacząć debugować i zademonstrować, jak wolny jest ból głowy i jak lepiej ES6. Nie jest to przekonujące.
Mam nadzieję, że to odpowiedziało na twoje pytanie. To stare pytanie, które dotyczy bardziej przyszłych pokoleń, ludzi, którzy wciąż się uczą.
Pytanie, kiedy ludzie mówią, że to nie ma znaczenia, czy tak to działa. Szanse są mądrzejsze, bardziej doświadczona osoba powie innym mądrym.
co jeśli ktoś zastąpi obiekt lokalizacji. Zrobią wstrząs dla starszych przeglądarek. Otrzyma nową funkcję, którą należy zmienić, a twój 3-letni kod zawiedzie.
Moja ostatnia uwaga do przemyślenia.
Pisanie czystego, przejrzystego i celowego kodu robi coś dla twojego kodu, na który nie można odpowiedzieć poprawnie lub źle. To sprawia, że twój kod aktywuje.
Możesz korzystać z większej liczby wtyczek, bibliotek bez obawy o przerwanie między kodami.
dla przypomnienia. posługiwać się
window.location.href
źródło
window.location.href
overwindow.location
, zapomniałeś, że pytanie dotyczyło różnicy między nimi awindow.location.replace()
TLDR; use location.href or better use window.location.href;
TLDR jest tą linią. Reszta to „odpowiedź”.mystring = location.href = "#/some/spa/route"
. Poza tym wiele języków zezwala na (niejawne) rzutowanie tekstu w jakiś sposób. Na koniec javascript jest dynamicznym językiem maszynowym, umieszczaj na nim koncepcje typów i powiedz, że to niedobrze, nie ma sensu się przejmować.console
lub ukryjewindow
- Teraz masz większy problem.