Mengapakah pembina URL tidak mengekod kurungan dalam rentetan pertanyaan?
<p>Dalam JavaScript, pembina <code>URL</code> tidak mengekodkan kurungan dan kurungan apabila ia muncul dalam rentetan pertanyaan, manakala <code>encodeURI</code> atau <code>encodeURIComponent< kod> akan sentiasa mengekodnya. Ini mengelirukan saya kerana kebanyakan sumber mengatakan untuk menggunakan <code>encodeURI</code>/<code>encodeURIComponent</code> untuk mengekod apabila anda memasukkan aksara khas dalam parameter pertanyaan. Saya menjangkakan kelakuan serupa untuk objek <code>URL</code> </p>
<p>Ini menyebabkan saya menghadapi masalah menulis ujian unit kerana saya tidak tahu bagaimana parameter pertanyaan objek URL akan dikodkan. Adakah terdapat spesifikasi yang menyatakan ini, atau patutkah saya sentiasa mengekod parameter sebelum menggunakan <code>URL</code> terima kasih atas bantuan anda. </p>
<hr />
<p>Contoh menunjukkan objek URL bukan pengekodan kurungan dalam rentetan pertanyaan</p>
<pre class="brush:js;toolbar:false;">const href = (URL baharu('https://foobar.com?myQuery={"@asdf/asdf":"1234"}' )).href;
// ^ https://foobar.com/?myQuery={%22@asdf/asdf%22:%221234%22}
</pra>
<p>Jika saya menggunakan <code>encodeURI</code>, satu-satunya perbezaan ialah kurungan dikodkan</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
</pra>
<hr />
<p>Nota: Jika kurungan tidak disertakan dalam parameter pertanyaan, objek URL akan mengekodnya. </p>
<pre class="brush:js;toolbar:false;">const href = (URL baharu('https://foobar.com/}}}?myQuery={"@asdf/asdf":" 1234"}')).href;
// ^ https://foobar.com/%7D%7D%7D?myQuery={%22@asdf/asdf%22:%221234%22}
</pra></p>