為何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={"@asdf/asdf":"1234"}
</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={"@asdf/asdf":"1234"}
</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/}}}?myQuery={"@asdf/asdf":"1234"}
</pre></p>