Qual é a diferença entre window.location = e window.location.replace ()?


Respostas:


408

window.location adiciona um item ao seu histórico, no qual você pode (ou deve poder) clicar em "Voltar" e voltar à página atual.

window.location.replace substitui o item do histórico atual para que você não possa voltar a ele.

Veja window.location:

assign(url): Carregue o documento no URL fornecido.

replace(url): Substitua o documento atual pelo documento na URL fornecida. A diferença do assign()método é que, depois de usar replace()a página atual, não será salva no histórico da sessão, o que significa que o usuário não poderá usar o botão Voltar para navegar até ela.

Ah, e de um modo geral:

window.location.href = url;

é favorecido sobre:

window.location = url;

52
Por que window.location.hrefseria favorecido window.location?
Mathias Bynens


1
Pergunta - Se eu usar o window.location.replace(URL)URL exatamente igual ao atual, posso esperar que ele seja atualizado / recarregado ou tem a opção de não fazer nada?
user9645

11

TLDR;

usar location.hrefou melhor usar window.location.href;

No entanto, se você ler isso, obterá uma prova inegável.

A verdade é que é bom usar, mas por que fazer coisas que são questionáveis. Você deve seguir o caminho mais alto e fazê-lo da maneira que provavelmente deve ser feito.

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

Esse código está perfeitamente correto em termos de sintaxe, lógica e tipo: você sabe a única coisa errada com ele?

tem em locationvez delocation.href

que tal isso

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

qual é o valor de mystring? alguém realmente sabe sem fazer algum teste. Ninguém sabe o que exatamente vai acontecer aqui. Inferno, acabei de escrever isso e nem sei o que faz. locationé um objeto, mas estou atribuindo uma sequência de caracteres que passará a string ou passará o objeto de localização. Vamos dizer que há alguma resposta sobre como isso deve ser implementado. Você pode garantir que todos os navegadores farão a mesma coisa?

Isso eu posso adivinhar que todos os navegadores irão lidar com o mesmo.

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

E se você colocar isso no texto datilografado, ele será quebrado porque o compilador de tipos dirá que isso é suposto ser um objeto?

Essa conversa é muito mais profunda do que apenas o locationobjeto. Qual é a conversão de que tipo de programador você deseja ser?

Se você pegar esse atalho, sim, pode estar tudo bem hoje, você pode estar bem amanhã, inferno, pode ficar bem para sempre, mas agora você é um péssimo programador. Não vai ser bom para você e vai falhar.

Haverá mais objetos. Haverá nova sintaxe.

Você pode definir um getter que pega apenas uma string, mas retorna um objeto, e a pior parte é que você acha que está fazendo algo correto, pode ser brilhante para esse método inteligente, porque as pessoas aqui o envergonharam.

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

Com getters e setters, esse código realmente funcionaria, mas apenas porque isso pode ser feito não significa que é 'WISE' fazer isso.

A maioria das pessoas que está programando gosta de programar e gosta de melhorar. Nos últimos anos, fiquei muito bom e aprendi muito. A coisa mais importante que eu sei agora, especialmente quando você escreve Bibliotecas, é consistência e previsibilidade.

Faça as coisas que você pode fazer consistentemente.

+"2"<- aqui analisa a string para um número. você deveria usá-lo? ou você deve usar parseInt("2")?

que tal var num =+"2"?

Pelo que você aprendeu, das mentes do stackoverflow não tenho muita esperança.

Se você começar a seguir estas 2 palavras consistentes e previsíveis. Você saberá a resposta certa para várias perguntas sobre o stackoverflow.

Deixe-me mostrar como isso compensa. Normalmente eu coloco ;em todas as linhas de javascript que escrevo. Eu sei que é mais expressivo. Eu sei que é mais claro. Eu segui minhas regras. Um dia eu decidi não. Por quê? Porque tantas pessoas estão me dizendo que não é mais necessário e o JavaScript pode ficar sem ele. Então, o que eu decidi fazer isso. Agora, porque eu me tornei um programador (como você deve apreciar o fruto de dominar uma linguagem), escrevi algo muito simples e não o verifiquei. Apaguei uma vírgula e não achei que fosse necessário testar novamente uma coisa tão simples como remover uma vírgula.

Eu escrevi algo semelhante a isso em es6 e babel

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

Esse código falhou e levou uma eternidade para descobrir. Por alguma razão, o que viu foi

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

escondido dentro do código fonte, ele estava me dizendo "olá mundo" não é uma função.

Para um nó mais divertido, não mostra os mapas de origem do código transpilado.

Perdi tanto tempo estúpido. Eu também estava apresentando a alguém sobre como o ES6 é brilhante e tive que começar a depurar e demonstrar como o ES6 é melhor e sem dor de cabeça. Não é convincente.

Eu espero que isto responda sua pergunta. Sendo uma pergunta antiga, é mais para a geração futura, pessoas que ainda estão aprendendo.

Pergunta quando as pessoas dizem que não importa de qualquer maneira. As chances são de que uma pessoa mais experiente e mais sábia lhe dirá de outra maneira.

e se alguém substituir o objeto de localização. Eles farão um calço para navegadores mais antigos. Ele receberá um novo recurso que precisa ser modificado e seu código de 3 anos falhará.

Minha última nota para refletir.

Escrever um código de propósito limpo e claro faz algo pelo seu código que não pode ser respondido com certo ou errado. O que ele faz é tornar seu código um facilitador.

Você pode usar mais plugins, bibliotecas, sem medo de interrupção entre os códigos.

para o registro. usar

window.location.href


24
Resposta informativa longa, argumentou apaixonadamente. Mas na argumentação para uso de window.location.hreflongo window.location, você esqueceu a questão estava realmente pedindo a diferença entre estes ewindow.location.replace()
AntonChanning

10
Sempre que vejo TLDR, espero uma resposta MAIS CURTA, e não uma que seja 5x mais longa.
user9645

3
TLDR; use location.href or better use window.location.href; O TLDR é essa linha. O resto é a "resposta".
Elysiumplain

Eu não acho que você faça sentido válido ao apresentar casos de uso incomuns. ie mystring = location.href = "#/some/spa/route". Além disso, muitos idiomas permitiriam a conversão de tipos (implícitos) de alguma maneira. No final do dia, o javascript é uma linguagem de tipo dinâmico, coloca conceitos de digitação e diz que não é bom, não faz sentido.
apple apple

1
e se alguém substituir o objeto de localização . bem, como dizer se alguém sobrescreve consoleou sombreia window- Agora você tem um problema maior .
apple apple
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.