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

IT技术 javascript window location
2021-01-24 07:11:55

这两条线有区别吗?

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

window.location 在您的历史记录中添加一个项目,您可以(或应该能够)单击“返回”并返回当前页面。

window.location.replace 替换当前历史记录项,因此您无法返回。

window.location

assign(url):在提供的 URL 加载文档。

replace(url):用提供的 URL 中的文档替换当前文档。与该assign()方法的不同之 处在于,使用replace()当前页面不会保存在会话历史记录中,这意味着用户将无法使用后退按钮导航到该页面。

哦,一般来说:

window.location.href = url;

优于:

window.location = url;
2021-03-17 07:11:55
接受的答案说在这种情况下没有最喜欢的。
2021-03-18 07:11:55
问题 - 如果我使用的window.location.replace(URL)URL 与当前 URL 完全相同,我可以期望它刷新/重新加载还是可以选择什么都不做?
2021-03-29 07:11:55
例如@theonlygusti,如果您使用的是jest,您可以模拟location 对象,然后您就可以期望调用assign() 函数: expect(window.location.assign).toBeCalledWith('/something-here')
2021-03-31 07:11:55
为什么会window.location.href受到青睐window.location
2021-04-11 07:11:55

TLDR;

使用location.href或更好地使用window.location.href

但是,如果您阅读本文,您将获得不可否认的证据。

事实是它很好用,但为什么要做有问题的事情。你应该走更高的路,按照它可能应该做的方式去做。

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

这段代码在语法、逻辑、类型方面都是完全正确的,你知道它唯一的错误吗?

它有location而不是location.href

那这个呢

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

的value是mystring什么?有没有人真的不做一些测试就知道了。没有人知道这里究竟会发生什么。见鬼,我刚刚写了这个,我什至不知道它是做什么的。location是一个对象,但我正在分配一个字符串,它将传递字符串还是传递位置对象。让我们说应该如何实施有一些答案。你能保证所有浏览器都会做同样的事情吗?

我几乎可以猜测所有浏览器都会处理相同的问题。

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

如果你把它放到typescript中会怎样,因为类型编译器会说这是一个对象?

然而,这次对话比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

TLDR; use location.href or better use window.location.href; TLDR 就是这条线。剩下的就是“答案”。
2021-03-15 07:11:55
如果有人覆盖位置对象怎么办好吧,就像说如果有人覆盖console或隐藏会怎样window- 现在您遇到了更大的问题。
2021-03-23 07:11:55
我认为您通过引入不常见的用例来提出有效观点。mystring = location.href = "#/some/spa/route"此外,许多语言会以某种方式允许(隐式)类型转换。归根结底,javascript 是一种动态类型语言,将类型概念放在上面并说它不好毫无意义。
2021-03-27 07:11:55
冗长的信息丰富的答案,热情地争论。但是在争论使用window.location.hrefover 时window.location,您忘记了问题实际上是在询问这些和window.location.replace()
2021-03-28 07:11:55
每当我看到 TLDR 时,我都希望得到一个更简短的答案,而不是长 5 倍的答案。
2021-04-08 07:11:55