这两条线有区别吗?
var url = "http://www.google.com/";
window.location = url;
window.location.replace(url);
这两条线有区别吗?
var url = "http://www.google.com/";
window.location = url;
window.location.replace(url);
当前回答
窗口。location在你的历史记录中添加了一个项目,这样你就可以(或者应该可以)点击“返回”并返回到当前页面。
replace替换当前历史项,因此您不能返回到它。
看到window.location:
assign(url):在此处加载文档 提供的URL。 replace(url):替换当前 在提供的文件 URL。区别在于 Assign()方法是在使用 Replace()当前页面将不会 保存在会话历史记录中,意思是 用户将无法使用Back 按钮导航到它。
哦,一般来说:
window.location.href = url;
优先于:
window.location = url;
其他回答
起源与解决方案
这个问题
这两条线有区别吗? 窗口。Location = "http://www.google.com/"; window.location.replace(“http://www.google.com/”);
简短的回答
Yes.
背景事实
首先,你要知道:
窗口。Location = "https://stackoverflow.com"是window.location.href = "https://stackoverflow.com"的别名,因此具有相同的功能。
窗口。location VS window.location.replace
window.location:
这里,我在寻址窗口。Location = "https://website.com"在window.location.href = "https://website.com"的上下文中
location对象上的href属性存储当前网页的URL。 在更改href属性时,用户将被导航到一个新的URL。 这将向历史记录列表中添加一个项目 移动到下一页后,用户可以点击“返回”按钮 浏览器返回此页。
window.location.replace:
replace功能用于导航到新的URL,而不向历史记录中添加记录。 此函数将覆盖最上面的条目,并将其从历史堆栈中替换。 点击“返回”按钮,您将无法在移动到下一页后返回到重定向之前访问的最后一页。
结论:
要回答这个问题:
是的,我们的两个研究对象之间有区别,主要是在窗口。location允许您返回到浏览器历史中,而window.location.replace()不允许您返回到浏览器历史中,从而从浏览器历史中删除先前的URL记录。
福利:哪个更快?
当你使用这个:window。Location = "http://www.google.com/";你直接更新href属性,这比使用window.location.replace("http://www.google.com/")更快;因为更新函数比直接更新属性要慢。
更多关于window.location的信息
窗口。location返回的location对象在内部是这样的:
console.log(window.location);
// This is how the Location object that returns from window.location looks like
{
"ancestorOrigins": {},
"href": "https://stackoverflow.com/",
"origin": "https://stackoverflow.com",
"protocol": "https:",
"host": "stackoverflow.com",
"hostname": "stackoverflow.com",
"port": "",
"pathname": "/",
"search": "",
"hash": ""
}
Location对象还有以下方法(函数):
Location.assign () 在参数中提供的URL处加载资源。
Location.reload () 重新加载当前URL,如Refresh按钮。
Location.toString () 返回一个包含整个URL的字符串。它是Location.href的同义词, 但是,它不能用于修改值。
窗口。location在你的历史记录中添加了一个项目,这样你就可以(或者应该可以)点击“返回”并返回到当前页面。
replace替换当前历史项,因此您不能返回到它。
看到window.location:
assign(url):在此处加载文档 提供的URL。 replace(url):替换当前 在提供的文件 URL。区别在于 Assign()方法是在使用 Replace()当前页面将不会 保存在会话历史记录中,意思是 用户将无法使用Back 按钮导航到它。
哦,一般来说:
window.location.href = url;
优先于:
window.location = url;
TLDR;
使用的位置。Href或者最好使用window.location.href;
然而,如果你读了这篇文章,你会得到不可否认的证据。
事实是,它可以使用,但为什么要做有问题的事情。你应该走更高的道路,按照可能应该做的方式去做。
location = "#/mypath/otherside"
var sections = location.split('/')
这段代码在语法、逻辑和类型方面都是完全正确的 你知道唯一的问题是什么吗?
它有location而不是location。href
这个呢
var mystring = location = "#/some/spa/route"
mystring的值是什么?有人不做测试就知道吗。没人知道这里到底会发生什么。该死,我刚写了这个,我甚至不知道它是干什么的。location是一个对象但我分配了一个字符串它会传递字符串还是传递location对象。让我们假设这应该如何实现有一些答案。你能保证所有的浏览器都做同样的事情吗?
这我几乎可以猜到所有的浏览器都会处理相同的。
var mystring = location.href = "#/some/spa/route"
如果你把它放到typescript中它会不会崩溃因为类型编译器会说这应该是一个对象?
然而,这个对话比位置对象要深入得多。这种转变是关于你想成为什么样的程序员?
如果你走这条捷径,也许今天可以,也许明天可以,也许永远都可以,但是你先生现在是一个糟糕的程序员。这对你来说是不好的,会让你失望的。
会有更多的物体。将会有新的语法。
你可以定义一个getter,它只接受一个字符串,但返回一个对象,最糟糕的是你会认为你做的事情是正确的,你可能认为你对这个聪明的方法很聪明,因为这里的人可耻地把你带进了歧途。
var Person.name = {first:"John":last:"Doe"}
console.log(Person.name) // "John Doe"
对于getter和setter,这段代码实际上是可以工作的,但仅仅因为可以这样做并不意味着这样做是“明智的”。
大多数编程的人都喜欢编程,喜欢变得更好。在过去的几年里,我学得很好,学到了很多东西。我现在知道的最重要的事情,尤其是当你写库的时候,是一致性和可预测性。
做那些你能坚持做的事情。
+"2" <——这里将字符串解析为数字。你应该使用它吗? 还是应该使用parseInt("2")?
变量数=+“2”呢?
从你学到的,从stackoverflow的想法我不太希望。
如果你开始遵循这两个词一致和可预测。您将知道stackoverflow上大量问题的正确答案。
Let me show you how this pays off. Normally I place ; on every line of javascript i write. I know it's more expressive. I know it's more clear. I have followed my rules. One day i decided not to. Why? Because so many people are telling me that it is not needed anymore and JavaScript can do without it. So what i decided to do this. Now because I have become sure of my self as a programmer (as you should enjoy the fruit of mastering a language) i wrote something very simple and i didn't check it. I erased one comma and I didn't think I needed to re-test for such a simple thing as removing one comma.
我在es6和babel中写了类似的东西
var a = "hello world"
(async function(){
//do work
})()
这段代码失败了,花了很长时间才弄清楚。 出于某种原因,它看到的是
var a = "hello world"(async function(){})()
隐藏在源代码深处,它告诉我“hello world”不是一个函数。
更有趣的是,节点不显示转译代码的源映射。
浪费了太多愚蠢的时间。我也向别人展示了ES6是多么的出色,然后我不得不开始调试并演示ES6是多么的令人头疼和更好。没有说服力。
我希望这回答了你的问题。这是一个老问题,更多的是为了未来的一代,那些仍在学习的人。
当人们说两种方法都无所谓的时候。机会是一个更聪明更有经验的人会告诉你其他的明智。
如果有人重写了location对象。他们将为旧的浏览器做一个垫片。它将获得一些需要调整的新功能,而你3年前的代码将会失败。
这是最后一个值得思考的问题。
编写干净、清晰、有目的的代码对你的代码有帮助,这是无法用对或错来回答的。它的作用是使你的代码成为一个使能器。
你可以使用更多的东西插件,库不用担心代码之间的中断。
郑重声明。使用
window.location.href