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


75

使用location.href = url和之间在JavaScript内存消耗方面是否有任何特别的优点/缺点location.assign(url)

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


2
stackoverflow.com/a/1865840/638649答案可能就是您想要的
matchew 2012年

@JuanMendes:我继承了基于<frameset>构建的Intranet应用程序,该应用程序像纸一样泄漏(每小时约50 mb的速度)而泄漏。我正在尽力保存内存。
Doug Weaver 2012年

1
我认为问题不在于使用了多少内存,而是与使用location.assign和相关的是否存在泄漏location.href = ''
Juan Mendes 2012年

6
未来的读者:我会强烈考虑:1. location.hrefvslocation.assign()不会影响性能,除非您的应用每秒更改数百次位置。2.如果您的应用正在执行此操作,那么这就是您需要解决的真正问题
乔丹·格雷

1
乔丹·格雷说的话。除非您这样做次数繁琐(用例可能需要这样做?),否则您将专注于性能,而绝对不应这样做。
J. Munson

Answers:


30

我一直使用,从来没有遇到过以下问题:

location.href = url;

调用一个函数应该比访问该属性慢一点,但是就内存而言,我的拙见并不应该有太大的不同。


为我工作。我不知道自己会省很多钱,但是我不知道是否有什么我在忽略。谢谢。
Doug Weaver 2012年

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

1
@Jerome同意使用更好,locaiton.assign()因为它是可测试的。分配location.href从未感到正确。
silvenon

41

我个人更喜欢调用函数,因为调用函数给我一个更好的印象,即某事物正在运行,而不仅仅是变化的变量的值。

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


1
刚刚检查了一下您的测试,看来location.href在Chrome中的速度是x1.5倍。
sertsedat '19

29

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

window.location.assign()如果您更关心测试,我会去的。使用函数可以模拟该函数并检查url输入参数。

因此,使用笑话:

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

myUrlUpdateFunction();

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

// Clean up :)
window.location.assign.mockRestore();

4
请记住,mockRestore()此处的调用不会还原原始的本机函数。要以正确的方式执行此操作,您需要使用jest.spyOn()函数-jestjs.io/docs/en/jest-object#jestspyonobject-methodname
Johny,

5

在使用location.href = url而不是location.assign(url)之间的JavaScript内存消耗方面是否有任何特别的优点/缺点?

没有

恰好有零差异。

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

除任何奇怪的浏览器错误外,净效果始终相同。您的脚本正在具有完全相同的内存消耗的全新VM中运行。

分配

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


那又如何location.assign("#foo")呢?
锂云母

是的,从理论上讲,您是对的,这可能是一个例外。但是,最有可能的是,无论您调用location.assign还是将其分配给属性,都在表面之下实际使用了相同的代码。属性设置器很可能只是调用assign。这就是我要构建的方式。:)
Stijn de Witt

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.