假设我使用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 的同义词,但它不能用于修改值。”好吧,我不想修改它。但是真的没有区别吗?也许是关于性能、浏览器支持¹ 甚至代码风格?我必须决定一个,那么我应该选择哪一个?
¹ 实际上,我可以看到这些转换方式的兼容性表存在差异。所以我想还有一些遗留的实现可以以不同的方式处理事情。我不敢相信这些是真正的“同义词”,而浏览器支持中的这个花言巧语似乎支持这种信念。
根据规范,他们做的完全一样。该href属性被标记为 a stringifier,这意味着在 JavaScript 中,该类获得了一个toString与该属性具有完全相同行为的方法。
正如您所注意到的,浏览器对它们的支持并不相同。还有一个比另一个更需要打字和传输。这完全取决于偏好。然而,我个人发现显式toString调用最能传达这样的信息“我有一个 URL 对象并希望它是一个纯字符串。 ”