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>
<p>クエリ文字列内の括弧をエンコードしていない URL オブジェクトを示す例</p>
<pre class="brush:js;toolbar:false;">const href = (新しい 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>
<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>