window.location =和window.location.replace()有什么区别?


Answers:


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'8


1
问题-如果我window.location.replace(URL)在哪里使用与当前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对象本身要深得多。这种转换意味着您想成为什么样的程序员?

如果您采用这种捷径,是的,今天可能还可以,明天可能就可以了,地狱永远都可以,但是您现在是一个糟糕的程序员。这对您来说不好,它将使您失望。

将有更多的对象。将会有新的语法。

您可能定义了一个只接受字符串但返回一个对象的getter,最糟糕的部分是您会认为自己做的正确,您可能会认为自己对这种聪明的方法很聪明,因为这里的人使您误入歧途。

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

使用getter和setter方法,该代码实际上可以工作,但是仅仅因为它可以完成并不意味着这样做是“明智的”。

大多数编程的人都喜欢编程,也喜欢变得更好。在过去的几年中,我变得相当不错,学到了很多东西。我现在知道的最重要的事情,尤其是在编写库时,是一致性和可预测性。

做您可以持续做的事情。

+"2"<-这里的权利将字符串解析为数字。你应该使用它吗?还是应该使用parseInt("2")

那又如何var num =+"2"呢?

从您学到的知识,从stackoverflow的思想中,我不太希望。

如果您开始遵循这两个词,则前后一致且可预测。您将了解有关stackoverflow的大量问题的正确答案。

让我告诉你这是如何回报的。通常我放在;我编写的每行JavaScript上。我知道它更具表现力。我知道这更清楚。我遵守了我的规则。有一天我决定不去。为什么?因为有很多人告诉我不再需要它了,因此JavaScript可以不用它。所以我决定这样做。现在,因为我已经确定了自己作为程序员的身份(因为您应该喜欢掌握某种语言的成果),所以我写的东西很简单,我没有检查。我删除了一个逗号,并且我认为我不需要为删除一个逗号这样的简单事情重新测试。

我在es6和babel中写了类似的东西

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

这段代码失败并花了很长时间才弄清楚。由于某种原因,它看到的是

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

隐藏在源代码中很深的地方告诉我“ hello world”不是一个函数。

为了更有趣,节点不显示已编译代码的源映射。

浪费了这么多愚蠢的时间。我也向某人介绍了ES6的出色表现,然后我不得不开始调试并演示ES6如何轻松自如。这不令人信服。

我希望这能回答您的问题。这是一个古老的问题,对于仍在学习中的下一代来说,更多。

当人们说这两种方法都没关系时,请问。更有经验的人会告诉你其他人。

如果有人覆盖位置对象该怎么办。他们将为较旧的浏览器提供填充。它将获得一些需要填充的新功能,而您使用3年的代码将失败。

我的最后一个注意事项。

编写干净,清晰,有目的的代码会为您的代码做一些无法正确或错误回答的事情。它的作用是使您的代码成为推动者。

您可以使用更多的东西插件,即库,而不必担心代码之间的中断。

作为记录。用

window.location.href


24
热情地争辩说,长期的翔实的回答。但是在争论使用window.location.hrefover时window.location,您忘记了问题实际上是在要求这些和window.location.replace()
AntonChanning

10
每当我看到TLDR时,我都希望得到更简短的答案,而不是更长的5倍。
user9645

3
TLDR; use location.href or better use window.location.href; TLDR是这一行。剩下的就是“答案”。
Elysiumplain

我认为您不会通过介绍不常见的用例来说明问题。即mystring = location.href = "#/some/spa/route"。此外,许多语言会以某种方式允许(隐式)类型转换。归根结底,javascript是一种动态类型化的语言,在其上放上类型概念,并说不好是毫无意义的。
苹果苹果

1
如果有人覆盖位置对象怎么办。好吧,就像说如果有人覆盖console或遮挡该怎么办window-现在您遇到了一个更大的问题。
苹果苹果
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.