【问题标题】:location.href property vs. location.assign() methodlocation.href 属性与 location.assign() 方法
【发布时间】:2012-05-05 09:13:43
【问题描述】:

在使用 location.href = urllocation.assign(url) 之间,JavaScript 内存消耗有什么特别的优势/劣势吗?

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

【问题讨论】:

  • stackoverflow.com/a/1865840/638649 答案可能就是你所追求的
  • @JuanMendes:我继承了一个基于 构建的 Intranet 应用程序,该应用程序像纸一样泄漏(速度约为每小时 50mb)。我正在尽我所能节省内存。
  • 我认为问题不在于使用了多少内存,而在于使用location.assignlocation.href = ''是否存在泄漏
  • 未来的读者:我强烈认为: 1. location.href vs location.assign() 不会影响性能,除非您的应用每秒更改位置数百次; 2. 如果您的应用正在这样做,这就是您需要解决的真正问题
  • 乔丹格雷所说的。除非您这样做的次数过多(什么用例可能需要这样做??),否则您绝对不应该关注性能。

标签: javascript


【解决方案1】:

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

但可能是的,根据我的测试,location.href = url; 可能确实比location.assign(url) 快,尽管它可能取决于 JavaScript 引擎的实现。 [已删除测试的死链接。]

【讨论】:

  • 刚刚检查了您的测试,似乎 location.href 在 Chrome 中的速度高达 x1.5 倍。
【解决方案2】:

我知道这是旧的,但是当我在寻找一种方法来检查我的单元测试是否重定向到正确的 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();

【讨论】:

【解决方案3】:

我一直使用并且从未遇到过问题:

location.href = url;

调用函数应该比访问属性稍慢,但在内存方面,我的拙见应该没有太大的区别。

【讨论】:

  • 为我工作。我不认为我会节省很多,但我不知道是否有什么我忽略了。谢谢。
  • 错了!即使可能有区别,但如果 'href' 是一个属性,则 document.location 不是(下面有一个 get/set)。其次,我们只谈论µS,也许更少。第三,根据上下文,使用assign() 似乎比分配href 更容易测试(至少使用jsdom)最后,调用assign() 似乎稍微慢一点jsperf.com/location-href-vs-location-assign/14
  • @Jerome 同意最好使用locaiton.assign(),因为它是可测试的。分配 location.href 从来没有感觉对。
  • 纯粹是哲学上的。它总是比直接访问更好的使用方法。
  • 我同意 - 纯粹是哲学上的。虽然 getter / setter 用于测试是绝对可能的(例如使用Object.defineProperty),但同时使用 get / set 用于属性在 TypeScript 中已经变得非常普遍 - 同时保持可测试性!但这完全偏离了关于属性访问和方法调用之间的内存消耗的最初问题:)
【解决方案4】:

使用 location.href = url 与 location.assign(url) 相比,JavaScript 内存消耗有什么特别的优势/劣势吗?

没有

差值正好为零。

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

除了任何奇怪的浏览器错误之外,最终效果总是相同的。您的脚本在内存消耗完全相同的全新 VM 中运行。

ulocation

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

【讨论】:

  • location.assign("#foo") 呢?
  • 是的,你是对的,理论上这可能是一个例外。然而,最有可能的是,无论您调用 location.assign 还是 assign 给属性,实际上在表面之下都使用了相同的代码。属性设置器很可能只是简单地调用分配。我就是这样建造它的。 :)
【解决方案5】:

在 Windows Server 2008 R2 / 7 64 位上针对 Chrome 40.0.2214.93 32 位测试我的机器/浏览器 http://jsperf.com/location-href-vs-location-assign/2

location.assign 比 location.href 慢 15%。

【讨论】:

  • 是的,您在 Web 应用程序中经常做的是每秒 500 次导航到新位置……这就是您应该考虑性能的原因。
【解决方案6】:

我想补充一下我在使用 React 时使用这两种方法时遇到的不同之处,但上面的答案都没有。

在 React 中分析以下 sn-p:

return (<>location.href = "www://example.com"</>)

对比

return (&lt;&gt;location.assign("www://example.com")&lt;/&gt;)

在前一种情况下,您实际上会看到字符串 www://example.com 在 DOM 上输入了一瞬间,因为它会在重定向发生之前呈现文本。

为了避免这种情况我们需要使用后者location.assign()

【讨论】:

  • 这是一种完全错误的重定向方法。 .assign 应在 return 语句上方调用,return 应返回 null&lt;&gt;&lt;/&gt;
【解决方案7】:

其实我觉得还是有区别的

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2014-08-18
    • 2017-11-09
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多