В чем разница между window.location = и window.location.replace ()?


273

Есть ли разница между этими двумя строками?

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

3
Я также объяснил это здесь: stackoverflow.com/questions/846954/…
Матиас Биненс

Ответы:


408

window.location добавляет элемент в вашу историю, так что вы можете (или должны иметь возможность) нажать «Назад» и вернуться на текущую страницу.

window.location.replace заменяет текущий элемент истории, поэтому вы не можете вернуться к нему.

Смотрите window.location:

assign(url): Загрузить документ по указанному URL.

replace(url): Заменить текущий документ документом по указанному URL. Отличие от assign()метода заключается в том, что после использования replace()текущая страница не будет сохранена в истории сеансов, то есть пользователь не сможет использовать кнопку «Назад» для перехода к ней.

Ну и вообще говоря

window.location.href = url;

является предпочтительным по сравнению с:

window.location = url;

52
Почему window.location.hrefпредпочтение больше window.location?
Матиас Биненс

13
Обсуждение здесь: stackoverflow.com/questions/2383401/…
goodeye

1
Вопрос. Если я использую window.location.replace(URL)URL-адрес, который совпадает с текущим, могу ли я ожидать, что он обновится / перезагрузится, или у него есть возможность ничего не делать?
user9645

11

TLDR;

использовать location.hrefили лучше использовать window.location.href;

Однако, если вы прочитаете это, вы получите неопровержимые доказательства.

Правда в том, что это нормально, но зачем делать сомнительные вещи. Вы должны идти по более высокой дороге и делать это так, как это, вероятно, следует делать.

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

Этот код совершенно правильный по синтаксису, по логике, по типу. Вы знаете, единственное, что с ним не так?

он имеет locationвместоlocation.href

как насчет этого

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

какова стоимость mystring? Кто-нибудь на самом деле знает, не пройдя тест? Никто не знает, что именно здесь произойдет. Черт, я только что написал это, и я даже не знаю, что он делает. locationявляется объектом, но я назначаю строку, передаст ли она строку или передаст объект местоположения. Допустим, есть какой-то ответ на то, как это должно быть реализовано. Можете ли вы гарантировать, что все браузеры будут делать то же самое?

Это я могу предположить, что все браузеры будут работать одинаково.

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

Что если вы поместите это в машинописный текст, он сломается, потому что компилятор типов скажет, что это объект?

Однако этот разговор намного глубже, чем просто locationпредмет. Что это за конверсия о том, каким программистом ты хочешь быть?

Если вы возьмете этот кратчайший путь, да, это может быть хорошо сегодня, вы можете быть хорошо завтра, черт возьми, это может быть хорошо навсегда, но вы, сэр, сейчас плохой программист. Это не будет хорошо для вас, и это подведет вас.

Там будет больше объектов. Там будет новый синтаксис.

Вы можете определить метод получения, который принимает только строку, но возвращает объект, и хуже всего то, что вы будете думать, что делаете что-то правильно, вы можете подумать, что вы великолепны в этом умном методе, потому что люди здесь постыдно сбили вас с пути.

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

С геттерами и сеттерами этот код действительно будет работать, но просто потому, что это можно сделать, не означает, что это «Мудрый».

Большинство людей, которые программируют, любят программировать и любят становиться лучше. За последние несколько лет я достаточно хорошо научился и многому научился. Самая важная вещь, которую я знаю сейчас, особенно когда вы пишете Библиотеки, это последовательность и предсказуемость.

Делайте то, что вы можете делать последовательно.

+"2"<- это прямо здесь разбирает строку на число. Вы должны использовать это? или вы должны использовать parseInt("2")?

о чем var num =+"2"?

Из того, что вы узнали, из умений stackoverflow я не слишком надеюсь.

Если вы начнете следовать этим 2 словам последовательным и предсказуемым. Вы будете знать правильный ответ на тонну вопросов по stackoverflow.

Позвольте мне показать вам, как это окупается. Обычно я помещаю ;в каждую строку написанного мной javascript. Я знаю, что это более выразительно. Я знаю, это более понятно. Я следовал своим правилам. Однажды я решил не делать этого. Зачем? Потому что многие люди говорят мне, что это больше не нужно, и JavaScript может обойтись без этого. Итак, что я решил сделать это. Теперь, когда я стал уверен в себе как программист (как вы должны наслаждаться плодами овладения языком), я написал что-то очень простое и не проверял. Я удалил одну запятую, и я не думал, что мне нужно повторно проверять такую ​​простую вещь, как удаление одной запятой.

Я написал нечто похожее на это в es6 и babel

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

Этот код потерпел неудачу и потребовалось навсегда, чтобы выяснить. По какой-то причине он увидел

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

скрытый глубоко в исходном коде, он говорил мне, что «привет мир» не является функцией.

Для большего удовольствия узел не показывает исходные карты переданного кода.

Потрачено впустую столько глупого времени. Я также рассказывал кому-то о том, насколько хорош ES6, а затем мне пришлось начать отладку и продемонстрировать, насколько свободна головная боль и лучше ES6. Это не убедительно.

Я надеюсь, что это ответило на ваш вопрос. Это старый вопрос, это больше для будущего поколения, людей, которые все еще учатся.

Вопрос, когда люди говорят, что это не имеет значения, так или иначе работает. Скорее всего, мудрее, более опытный человек скажет вам другое.

Что делать, если кто-то перезаписывает местоположение объекта. Они сделают прокладку для старых браузеров. Он получит некоторую новую функцию, которая должна быть изменена, и ваш 3-летний код потерпит неудачу.

Мое последнее замечание для размышления.

Написание чистого, ясного целенаправленного кода делает что-то для вашего кода, и на него нельзя ответить правильным или неправильным. Он делает ваш код активатором.

Вы можете использовать больше вещей, плагинов, библиотек без страха прерывания между кодами.

Для записи. использование

window.location.href


24
Длинный информативный ответ, страстно аргументированный. Но, рассуждая об использовании window.location.hrefover window.location, вы забыли, что вопрос на самом деле window.location.replace()
касался

10
Каждый раз, когда я вижу TLDR, я ожидаю более короткий ответ, а не тот, который в 5 раз длиннее.
user9645

4
TLDR; use location.href or better use window.location.href; TLDR - это линия. Остальное «ответ».
Elysiumplain

Я не думаю, что вы делаете правильное замечание, вводя необычный вариант использования. то есть mystring = location.href = "#/some/spa/route". Кроме того, многие языки допускают (неявное) приведение типов каким-либо образом. В конце концов, javascript - это динамический типизированный язык, в него помещают концепции типов и говорят, что это нехорошо.
яблочное яблоко

1
Что делать, если кто-то перезаписывает местоположение объекта . ну, просто как сказать, что если кто-то перезаписывает consoleили затеняет window- теперь у вас есть большая проблема.
яблочное яблоко
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.