为何URL构造函数不会对查询字符串中的括号进行编码?
<p>在JavaScript中,当括号和圆括号出现在查询字符串中时,<code>URL</code>构造函数不会对它们进行编码,而<code>encodeURI</code>或<code>encodeURIComponent</code>总是会对它们进行编码。这让我感到困惑,因为大多数来源都说在查询参数中包含特殊字符时要使用<code>encodeURI</code>/<code>encodeURIComponent</code>进行编码。我期望<code>URL</code>对象具有类似的行为。</p>
<p>这导致我在编写单元测试时遇到问题,因为我不知道URL对象的查询参数将如何进行编码。是否有规范来说明这一点,还是我应该在使用<code>URL</code>构造函数之前始终对参数进行编码?谢谢您的帮助。</p>
<hr />
<p>示例显示URL对象在查询字符串中不对括号进行编码</p>
<pre class="brush:js;toolbar:false;">const href = (new URL('https://foobar.com?myQuery={"@asdf/asdf":"1234"}')).href;
// ^ https://foobar.com/?myQuery={%22@asdf/asdf%22:%221234%22}
</pre>
<p>如果我使用<code>encodeURI</code>,唯一的区别就是括号被编码了</p>
<pre class="brush:js;toolbar:false;">const href = encodeURI('https://foobar.com?myQuery={"@asdf/asdf":"1234"}');
// ^ https://foobar.com?myQuery=%7B%22@asdf/asdf%22:%221234%22%7D
</pre>
<hr />
<p>注意:如果括号不在查询参数中,URL对象会对其进行编码。</p>
<pre class="brush:js;toolbar:false;">const href = (new URL('https://foobar.com/}}}?myQuery={"@asdf/asdf":"1234"}')).href;
// ^ https://foobar.com/%7D%7D%7D?myQuery={%22@asdf/asdf%22:%221234%22}
</pre></p>