javascript — В чем разница между window.location= и window.location.replace()?
TLDR;
используйте location.href
или лучше используйте window.location.href
;
Однако, если вы прочтете это, вы получите неопровержимое доказательство.
Правда в том, что его можно использовать, но зачем делать сомнительные вещи. Вы должны выбрать более высокий путь и просто сделать это так, как это, вероятно, должно быть сделано.
location = "#/mypath/otherside" разделы var = location.split('/')
Этот код совершенно корректен с точки зрения синтаксиса, логики, типа знаешь, что в этом плохого?
у него адрес
вместо location.href
как насчет этого
var mystring = location = "#/some/spa/route"
каково значение mystring
? кто-нибудь действительно знает, не делая некоторые тесты. Никто не знает, что именно здесь произойдет. Черт, я только что написал это, и я даже не знаю, что это делает.
— это объект, но я назначаю строку, будет ли она передавать строку или передавать объект местоположения. Допустим, есть некоторый ответ на то, как это должно быть реализовано. Можете ли вы гарантировать, что все браузеры будут делать то же самое?
Я могу предположить, что все браузеры будут работать одинаково.
var mystring = location.href = "#/some/spa/route"
А если вы поместите это в машинописный текст, он сломается, потому что компилятор типов скажет, что это должен быть объект?
Однако этот разговор намного глубже, чем просто объект location
. Что это за обращение о том, каким программистом вы хотите быть?
Если вы выберете этот короткий путь, то да, сегодня все будет хорошо, завтра все будет хорошо, черт возьми, это может быть хорошо навсегда, но вы, сэр, теперь плохой программист. Это не будет хорошо для вас, и это подведет вас.
Объектов будет больше. Будет новый синтаксис.
Вы можете определить геттер, который принимает только строку, но возвращает объект, и хуже всего то, что вы будете думать, что делаете что-то правильно, вы можете подумать, что вы гениальны для этого умного метода, потому что люди здесь постыдно ввели вас в заблуждение.
var Person.name = {первый:"Джон":последний:"Доу"} console.log(Person.name) // "Джон Доу"
С геттерами и сеттерами этот код действительно будет работать, но только потому, что это можно сделать, не означает, что это «МУДРО».
Большинство людей, занимающихся программированием, любят программировать и хотят совершенствоваться. За последние несколько лет я стал довольно хорошим и многому научился. Самая важная вещь, которую я знаю сейчас, особенно когда вы пишете библиотеки, — это последовательность и предсказуемость.
Делайте то, что вы можете постоянно делать.
+"2"
<-- прямо здесь разбирает строку на число. вы должны использовать его?
или вы должны использовать parseInt(«2»)
?
как насчет var num =+"2"
Из того, что вы узнали, из соображений stackoverflow я не очень надеюсь.
Если вы начнете следовать этим 2 словам последовательно и предсказуемо. Вы узнаете правильный ответ на массу вопросов о stackoverflow.
Позвольте мне показать вам, как это окупается.
Обычно я ставлю ;
в каждой строке javascript, которую я пишу. Я знаю, что это более выразительно. Я знаю, что это более ясно. Я следовал своим правилам. Однажды я решил не делать этого. Почему? Потому что так много людей говорят мне, что он больше не нужен и JavaScript может обойтись без него. Итак, что я решил сделать это. Теперь, когда я стал уверен в себе как программист (так как вы должны наслаждаться плодами освоения языка), я написал что-то очень простое, и я не проверял это. Я стер одну запятую и не думал, что мне нужно перепроверять такую простую вещь, как удаление одной запятой.
Я написал что-то подобное в es6 и babel
var a = "hello world" (асинхронная функция(){ //Выполнять работу })()
Этот код не работает, и его вычисление заняло целую вечность. По какой-то причине он увидел
var a = "hello world"(async function(){})()
, скрытый глубоко в исходном коде, говорил мне, что «привет, мир» не является функцией.
Для большего удовольствия узел не показывает исходные карты транспилированного кода.
Столько глупого времени потрачено впустую. Я также рассказывал кому-то о том, насколько великолепен ES6, а затем мне пришлось начать отладку и продемонстрировать, насколько ES6 лучше и без головной боли. Не убедительно это.
Надеюсь, это ответило на ваш вопрос. Это старый вопрос, он больше для будущего поколения, людей, которые все еще учатся.
Вопрос, когда люди говорят, что это не имеет значения, так или иначе работает. Скорее всего, более мудрый и опытный человек подскажет вам другую мудрость.
что, если кто-то перезапишет объект местоположения. Они сделают прокладку для старых браузеров. Он получит какую-то новую функцию, которую нужно изменить, и ваш трехлетний код не сработает.
Моя последняя записка для размышлений.
Написание чистого, ясного целенаправленного кода делает с вашим кодом нечто, на что нельзя ответить правильно или неправильно. Что он делает, так это делает ваш код активатором.
Вы можете использовать дополнительные плагины, библиотеки, не опасаясь перерыва между кодами.
для протокола. используйте
window.location.href
location.replace() и location.assign() — Блог Bambielli
1 минута чтения
TIL как использовать location.replace()
и location.assign()
для программного изменения URL-адресов в браузере.
location.assign() заставляет браузер перейти по указанному URL-адресу. Предоставленный URL-адрес добавляется в историю браузера : пользователь может нажать кнопку «Назад» и вернуться на страницу, на которой он находился до вызова
.
location.replace() ведет себя почти так же, как location.assign()
, однако вместо добавления предоставленного URL-адреса в историю браузера replace()
заменяет текущий URL-адрес в истории на предоставленный. Это фактически стирает текущий URL-адрес из истории браузера: пользователь не сможет нажать кнопку «Назад», чтобы вернуться на страницу, на которой он находился до вызова replace()
.
Маленькая, но важная деталь
Аргумент функции assign() или replace() может быть
Если передан относительный URI, браузер добавит относительный URI в конец базового пути для текущего домена. Косая черта в начале /
в предоставленном URI приведет к замене всего пути на предоставленный URI. Если не указан начальный /
, будет заменена только последняя часть имени пути! Это предостережение сбивало меня с толку в течение некоторого времени, когда я пытался программно манипулировать историей в контексте приложения реактивного маршрутизатора.
Ознакомьтесь со следующими примерами, чтобы увидеть поведение:
// Полный URL-адрес // текущий URL: http://localhost:3000/users/1 location.assign('https://developer.mozilla.org/en-US/docs/Web/API/Location/assign'). // новый URL: https://developer.mozilla.org/en-US/docs/Web/API/Location/assign // Относительный URI с косой чертой в начале // текущий URL: http://localhost:3000/users/1 location.assign('/accounts/1'). // новый URL: http://localhost:3000/accounts/1 // Относительный URI без ведущей косой черты // текущий URL: http://localhost:3000/users/1 location.assign('2'). // новый URL: http://localhost:3000/users/2
Управление историей с помощью реактивного маршрутизатора
При использовании API истории react-router history.push()
действует как location.assign()
и history.replace()
действует как, как вы уже догадались, location.replace()
.
Использование этих методов с hashRouter может несколько сбивать с толку… hashRouter отслеживает свое «путевое имя» после хеша в URL-адресе. Это означает, что значение, хранящееся в history.location.
эквивалентно значению, хранящемуся в window.location.hash
! history.location.pathname
поэтому всегда должен быть синхронизирован с window.location.hash
.
Недавно я столкнулся со странной ошибкой, о которой, думаю, напишу в отдельном посте. Найдите соответствующий пост о переполнении стека здесь.
Обновлено:
Комментарии
Вам также может понравиться
2 минуты чтения
Ого, какая неделя! Мне посчастливилось посетить Денверскую неделю стартапов (DSW) в рамках второй группы программы амбассадоров.
5 минут чтения
Темой моего курса «Взаимодействие человека с компьютером» был жизненный цикл дизайна.