Warum kodiert der URL-Konstruktor keine Klammern in der Abfragezeichenfolge?
<p>In JavaScript kodiert der <code>URL</code> Klammern und Klammern nicht, wenn sie in einer Abfragezeichenfolge erscheinen, während <code>encodeURI</code> oder <code>encodeURIComponent</ code> wird sie immer kodieren. Das verwirrt mich, weil die meisten Quellen sagen, dass man <code>encodeURI</code>/<code>encodeURIComponent</code> zum Codieren verwenden soll, wenn man Sonderzeichen in Abfrageparameter einfügt. Ich habe ein ähnliches Verhalten für das Objekt <code>URL</code> erwartet. </p>
<p>Dadurch habe ich Probleme beim Schreiben von Unit-Tests, da ich nicht weiß, wie die Abfrageparameter des URL-Objekts codiert werden. Gibt es eine Spezifikation, die dies besagt, oder sollte ich Parameter immer codieren, bevor ich den <code>URL</code>-Konstruktor verwende? Ich danke Ihnen für Ihre Hilfe. </p>
<hr />
<p>Beispiel, das zeigt, dass ein URL-Objekt Klammern in der Abfragezeichenfolge nicht kodiert</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>Wenn ich <code>encodeURI</code> verwende, besteht der einzige Unterschied darin, dass die Klammern codiert sind</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>Hinweis: Wenn die Klammern nicht in den Abfrageparametern enthalten sind, werden sie vom URL-Objekt codiert. </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>