location.href属性与location.assign()方法

Dou*_*ver 63 javascript

在JavaScript内存消耗之间是否有任何特定的优势/劣势使用location.href = url而不是location.assign(url)

我想我想知道是否需要更多的内存来访问该方法而不是设置属性.

Per*_*ere 32

我个人更喜欢调用函数,因为调用函数会给我一个更好的印象,即某些东西正在运行,这不仅仅是一个正在改变的变量的值.

但可能是的,可能location.href = url;更快location.assign(url),虽然它可能取决于JavaScript引擎实现,但请参阅我刚刚创建的测试.

  • 刚刚检查了您的测试,看来 location.href 在 Chrome 中速度快了 1.5 倍。 (2认同)

Tob*_*ogh 28

我总是使用,从来没有遇到过问题:

location.href = url;
Run Code Online (Sandbox Code Playgroud)

调用函数应该比访问属性稍慢,但就内存而言,我的拙见不应该有很大的不同

  • 错了!即使可能有所不同,但如果'href'是属性,则document.location不是(在下面有一个get / set)。其次,我们只讨论µS,也许更少。第三,根据上下文,使用`assign()`似乎比分配`href`(至少使用jsdom)更具可测试性。最后,似乎调用`assign()`的速度稍微慢一点https:// jsperf.com/location-href-vs-location-assign/14。 (2认同)

kie*_*ill 16

我知道这已经过时了,但是当我正在寻找一种方法来检查我的单元测试是否重定向到正确的URL时,我偶然发现了这一点.

window.location.assign()如果你更关心测试,我会选择.使用函数可以模拟所述函数并检查url输入参数.

所以,使用jest:

window.location.assign = jest.fn();

myUrlUpdateFunction();

expect(window.location.assign).toBeCalledWith('http://my.url');

// Clean up :)
window.location.assign.mockRestore();
Run Code Online (Sandbox Code Playgroud)

  • 请记住,此处的`mockRestore()`调用不会还原原始的本机函数。为了以适当的方式做到这一点,您需要使用`jest.spyOn()`函数-https://jestjs.io/docs/en/jest-object#jestspyonobject-methodname (3认同)

Sti*_*itt 5

使用location.href = url而不是location.assign(url)之间的JavaScript内存消耗是否有任何特殊优势/劣势?

没有

没有差别.

这样做的原因是简单的.每次浏览器加载新页面时,它都会启动一个全新的Javascript"VM",其中该页面的脚本在该VM中运行.在运行问题中的任何一个语句时,您指示浏览器加载新页面,这意味着销毁当前VM(并释放与其关联的任何内存)并为新页面加载全新VM.

除了任何奇怪的浏览器错误,净效果总是相同的.您的脚本在具有完全相同内存消耗的全新VM中运行.

ulocation

如果您正在浏览器中使用位置对象,并且希望能够在Node JS上运行此代码(例如,用于测试或等距代码),则可以使用ulocationLocation对象的通用/等距实现.完全披露:我是该软件包的作者.


And*_*aem 5

实际上我认为是有区别的

  1. location.href 是一个属性,这意味着它比调用函数更快,但最重要的是 href 属性使用户能够在单击浏览器上的后退按钮时返回
  2. location.replace() 用户将无法返回到当前页面。
  3. location.assign() 用户将能够通过像 href 一样的后退按钮返回,但 location.assign 在测试和模拟方面更好