将 URL 接口转换为字符串时,href 和 toString 有什么区别?

rug*_*ugk 5 javascript url

假设我使用URL 接口来创建一个新的 URL。比如这样:

new URL('https://www.example.com/démonstration.html?query=6#bla')
Run Code Online (Sandbox Code Playgroud)

现在我需要它作为一个普通的字符串。我如何最好地转换它?

注意:这里的例子是最小的例子。我显然不会将(硬编码)字符串转换为 URL 对象,然后再转换回字符串。为了给出一些上下文,假设我修改了两者之间的 URL 对象(可能使用用户输入)和/或将其传递给不同的函数左右。最后,我有一个 URL 对象并希望它是一个纯字符串。


我找到了以下方法:

  • 通过href财产:

    (new URL('https://www.example.com/démonstration.html?query=6#bla')).href
    // "https://www.example.com/d%C3%A9monstration.html?query=6#bla"
    
    Run Code Online (Sandbox Code Playgroud)
  • 通过toString方法:

    (new URL('https://www.example.com/démonstration.html?query=6#bla')).toString()
    // "https://www.example.com/d%C3%A9monstration.html?query=6#bla"
    
    Run Code Online (Sandbox Code Playgroud)

如您所见,在我的示例中,它返回的结果完全相同。


所以看看你注意到的文档

  • href 是“包含整个 URL 的 USVString”。
  • toString 返回“包含整个 URL 的 USVString。它是 URL.href 的同义词,但它不能用于修改值。”

好吧,我不想修改它。但是真的没有区别吗?也许是关于性能、浏览器支持¹ 甚至代码风格?我必须决定一个,那么我应该选择哪一个?

¹ 实际上,我可以看到这些转换方式的兼容性表存在差异。所以我想还有一些遗留的实现可以以不同的方式处理事情。我不敢相信这些是真正的“同义词”,而浏览器支持中的这个花言巧语似乎支持这种信念。

Ber*_*rgi 5

根据规范,他们做的完全一样。该href属性被标记为 a stringifier,这意味着在 JavaScript 中,该类获得了一个toString与该属性具有完全相同行为的方法。

正如您所注意到的,浏览器对它们的支持并不相同。还有一个比另一个更需要打字和传输。这完全取决于偏好。然而,我个人发现显式toString调用最能传达这样的信息“我有一个 URL 对象并希望它是一个纯字符串。

  • @rugk [所有微基准测试肯定会失败...](https://mrale.ph/blog/2012/12/15/microbenchmarks-fairy-tale.html) (2认同)