Яка різниця між window.location = та window.location.replace ()?


273

Чи є різниця між цими двома рядками?

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

3
Я також пояснив це тут: stackoverflow.com/questions/846954 / ...
Матіас Bynens

Відповіді:


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?
Mathias Bynens

13
Обговорення тут: stackoverflow.com/questions/2383401 / ...
goodeye

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

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"

З геттерами та сетерами цей код насправді спрацює, але те, що він може бути зроблений, не означає, що це "WISE".

Більшість людей, які програмують, люблять програмувати і люблять покращуватися. За останні кілька років я набрався досить непогано і багато чому вчився. Найголовніше, що я зараз знаю, особливо коли ви пишете Бібліотеки, - це послідовність та передбачуваність.

Робіть те, що ви можете послідовно робити.

+"2"<- це право тут аналізує рядок на число. ви повинні використовувати його? чи варто використовувати parseInt("2")?

про що var num =+"2"?

З того, що ви навчились, я не надто сподіваюся, що я розумію

Якщо ви почнете виконувати ці 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.hrefнад window.location, ви забули, що питання насправді просить про різницю між цими іwindow.location.replace()
AntonChanning

10
Щоразу, коли я бачу TLDR, я очікую відповіді SHORTER, а не тієї, яка на 5 разів довша.
користувач9645

3
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.