You sort a URL's search parameters and discover that spaces and tildes are written differently afterwards. Did sorting corrupt the address? Not necessarily. Editing the live parameter list can also serialise it using a different set of encoding rules from the URL's original query spelling.
The short answer is to preserve three records: the query text, its ordered name–value tuples and the URL object associated with the parameter list. Two spellings can decode to the same tuples, while an edit can also change order, remove repeated values or update the live URL. These are different outcomes that need separate checks.
This guide follows original catalogue addresses using the reserved example.test domain. They are teaching inputs, not working destinations. We will sort, append, replace and delete values, distinguish a live parameter object from an independent copy, and explain why a successful value comparison does not prove that every server, cache or signature scheme treats two written addresses identically.
This specialist guide belongs to the Websites root. It also connects to The Gold Standard of Education | Learning That Transfers into Life and the How X Works hub. The worked cases are original teaching examples; their numbers are stipulated so that the reasoning can be checked.
eduKateSG · Websites
Find your next learning step
Preserve the original text and tuple list. Identify whether the edited parameter object is live or independent before predicting its effect on the URL.
ROUTE 1 · CHAPTERS 1–3
Name the representation
Separate address text, parsed tuples and the equality being claimed.
ROUTE 2 · CHAPTERS 4–8
Follow sorting and association
Trace reserialisation, read-only inspection, independent copies and live references.
ROUTE 3 · CHAPTERS 9–12
Trace each list mutation
Work append, set, deletion and the empty-query boundary.
ROUTE 4 · CHAPTERS 13–16
Preserve the wider contract
Keep encoded data, sorting policy, equivalence and actual navigation distinct.
ROUTE 5 · CHAPTERS 17–19
Practise and verify
Solve a fresh archive query and retain a bounded transformation record.
Chapter contents
Name the representation · Chapters 1–3
1. Name the object before editing its text
2. Read a query as an ordered tuple list
3. Separate equivalent decoded values from identical spelling
Follow sorting and association · Chapters 4–8
4. Predict the first sort completely
5. Remove reordering from the experiment
6. Distinguish reading from mutating the live list
Trace each list mutation · Chapters 9–12
9. Append a new value without replacing existing values
10. Use set only when collapsing a name is intended
Preserve the wider contract · Chapters 13–16
13. Preserve literal plus, percent and separator data
14. Keep name sorting separate from value ranking
15. Do not promote tuple equality into universal URL equivalence
Practise and verify · Chapters 17–19
17. Work a changed archive query independently
18. Build an exact but bounded verification record
19. Repair the first changed layer and choose the next reading
CHAPTER 1 OF 19 · Name the representation
1. Name the object before editing its text
An address written in a document is a string. A URL object represents a parsed address with components. Its searchParams property provides an object whose list represents query name–value tuples. These are related representations, but they are not one undifferentiated string being edited in place.
For a fictional catalogue, start with https://example.test/catalog?b=two%20words&a=~&b=plus%2Bsign#list. The path is /catalog, the query follows the question mark, and list is the fragment. The b name occurs twice. Each of these facts belongs in the initial record before any transformation runs.
Reading the parameter list yields b with value two words, a with value ~, and b with value plus+sign, in that order. The space and literal plus are decoded data values. Their original written forms, %20 and %2B, are not retained as separate escape-style preferences in those tuple values.
The root website question is which resource and filter state the visitor intends to reach. This specialist question concerns how an editing API changes the representation of that state. A tidy URL is useful only if its transformation preserves the distinctions that the task actually needs.
Make separate columns for the original string, parsed component values, tuple sequence and any rewritten address. If a comparison fails, those columns locate the first changed layer. Without them, an explanation can blame sorting for a value loss actually caused by a later scalar conversion.
Our initial parameter sequence contains three tuples, not a map containing two unique keys. The b entries carry two different values and retain their relative positions. A list model can preserve that information without guessing which occurrence the application considers primary.
The get method returns the first value for a name, while getAll returns its values in list order. Thus get('b') gives two words, but getAll('b') gives two words followed by plus+sign. These are different questions asked of the same list.
The size property counts tuples, so it reports three in this example. Counting distinct names would report two. Neither count is inherently wrong, but labelling one as the other creates a misleading audit. A successful get does not establish that no second value exists.
The existing native-form entry-list guide develops the broader importance of preserving repeated names. Here that list discipline is used to follow the specific URLSearchParams editing and serialisation behaviour. It does not assign universal service meaning to repeated query names.
For the catalogue, a receiving service might deliberately interpret b as a list, reject repetition or use another documented contract. The browser-side list alone cannot choose that policy. Preserve its exact tuples first, then compare them with what the intended consumer expects rather than silently throwing one away.
CHAPTER 3 OF 19 · Name the representation
3. Separate equivalent decoded values from identical spelling
Consider two small query strings: q=two%20words and q=two+words. Under the URLSearchParams string parser, both give a q value containing a space. They agree at that decoded tuple level, although their written query text differs.
Now compare q=two%2Bwords. Its q value contains a literal plus. This does not agree with the space-containing value. The parser's plus-to-space handling occurs on the written form before a represented plus becomes decoded data. Replacing every plus after decoding would damage that distinction.
Likewise, a=~ and a=%7E can supply the same tilde value. Equality of those values does not mean the parameter object stores a promise to reproduce the exact original escape spelling when serialised later. The list stores decoded names and values according to its model.
Keep the equality relation explicit. “Same q value under this parser” is a smaller claim than “same URL bytes” or “interchangeable for every application.” A document can be correct about one relation and wrong if its language quietly expands the claim to all others.
This distinction is a practical debugging aid. If the tuple values stay the same while spelling changes, investigate serialisation. If the tuples themselves change, investigate parsing or the chosen mutation. Comparing only the final address strings cannot tell which kind of difference occurred.
CHAPTER 4 OF 19 · Follow sorting and association
4. Predict the first sort completely
Call sort on the live searchParams object for our catalogue URL. The list is ordered by names using the standard's code-unit comparison, with equal-name order preserved. The a tuple moves before the two b tuples. The b values remain two words followed by plus+sign.
The associated URL is then updated from the serialised list. Its resulting query is a=%7E&b=two+words&b=plus%2Bsign. Both order and spelling changed: a moved, the space now uses plus, and the tilde now uses %7E. The literal plus remains represented as %2B.
The path and fragment remain /catalog and #list in this example. A query-list sort did not ask to change those components. Recording them provides a useful check against accidentally constructing a new whole address from only the parameter output.
Do not explain the tilde change as sorting the tilde alphabetically. Sorting chooses tuple order by names; serialisation chooses the written form of names and values. These are separate operations within the observed update. Their effects happen together here but answer different questions.
An exact expected-output string is valuable for this original case. It checks the order, encoded data and retained fragment at once. Follow that check with a tuple comparison so the result distinguishes intended reordering from unintended value mutation rather than merely reporting that the URL looks different.
CHAPTER 5 OF 19 · Follow sorting and association
5. Remove reordering from the experiment
Use a fresh address whose list is already ordered: https://example.test/catalog?a=~&b=two%20words#list. Calling sort does not need to move either tuple. Nevertheless, the update serialises their values using the parameter object's form-encoding rules.
The resulting query is a=%7E&b=two+words. The absence of a tuple-order change did not imply the written query would remain byte-for-byte identical. This controlled example separates sorting's order effect from the update's spelling effect more clearly than the first mixed case.
The same reasoning warns against calling a mutating method merely to confirm a condition when exact query spelling must be retained. A call that leaves the logical list unchanged can still run an update step on a live associated URL. Investigate that contract rather than assuming a semantic no-op is a representation no-op.
In a review, write the expected invariant precisely: unchanged tuple sequence, unchanged decoded values, unchanged URL spelling or unchanged application result. Each is a different test. Passing the first two does not automatically pass the third, and the fourth requires knowledge of the receiving application.
For a student, ask why an already sorted list is a better discriminator than another unsorted list. It holds tuple order constant while exposing serialisation. That is changed-context reasoning: simplify one effect to make the remaining mechanism observable, without inventing an explanation from a busy example.
CHAPTER 6 OF 19 · Follow sorting and association
6. Distinguish reading from mutating the live list
A call to get reads a decoded value. A call to toString obtains the parameter list's serialised representation. That string can differ from the URL's existing search spelling without the read itself changing the associated URL.
For the already ordered fresh address, inspecting search can show ?a=~&b=two%20words, while searchParams.toString() gives a=%7E&b=two+words. The second string does not include a leading question mark. These two outputs are representations with different purposes.
Now call a mutating method such as sort. Its update step can replace the associated URL's query with the parameter serialisation. The changed search spelling follows mutation, not a requirement that every read synchronise the URL to the stringifier's preferred format.
Keep a before-read, after-read and after-mutation ledger. If code prints both strings without those labels, a reader can mistakenly infer that the first print caused the change or that the URL object contradicted itself. Labelling the object and operation resolves the apparent conflict.
A real implementation review should also identify other code that writes search or href. A spelling change observed between two logs might have another cause. The paper example isolates one operation; an application investigation needs the actual sequence rather than assuming every later difference came from the line currently under inspection.
CHAPTER 7 OF 19 · Follow sorting and association
7. Copy the list when the original must remain untouched
Construct a new URLSearchParams from the original URL's search string, then sort that independent object. It has its own tuple list and no association with the original URL object. Its serialised output can be compared while the original URL retains its query spelling.
For our original catalogue address, the copy's sorted output is a=%7E&b=two+words&b=plus%2Bsign. The original URL can still contain b=two%20words&a=~&b=plus%2Bsign. The difference is deliberate: one is an independently derived representation and the other is the preserved input object.
Creating a new URLSearchParams from another parameter object's iterable entries also copies its tuples. It does not create a second live editor attached to the first object's associated URL. The constructor's input representation should still be stated when teaching the copy relationship.
If the application later assigns the copied string to the URL's search, that is a separate explicit write. The copy protected the original only until code chose to commit the new representation. Keep proposal and commit distinct instead of describing the copy as a permanent shield against all later modifications.
This pattern is useful for previews, comparisons and controlled transformations. It is not permission to normalise every address. Decide which representation the application may change, preserve the original where needed and verify the proposed output against the actual receiving contract before committing it.
CHAPTER 8 OF 19 · Follow sorting and association
8. Follow a retained live parameter reference
Let P be a retained reference to url.searchParams. P is the parameter object associated with that URL object. If code later assigns a new search string to the same URL, the associated list is updated. A retained P is not a frozen snapshot of the query that existed when it was first read.
Start with q=amber, retain P, then assign url.search = '?q=blue&mode=short'. Reading P now yields blue for q and short for mode. The object reference remains useful, but the data it exposes follows the URL's current query relationship.
Compare that with independent copy Q created before the assignment. Q can retain the earlier q=amber tuple. P and Q may therefore disagree afterwards without either being broken. Their association and construction times differ.
This is another reason to label snapshots explicitly in a test record. A variable named oldParams might still hold the live associated object. Its name does not make its contents historical. Choose a real independent copy if the investigation needs a prior tuple sequence.
The existing observer articles practise a related habit: a live object reference need not be a historical snapshot. The underlying APIs differ, so do not transfer observer delivery rules. Transfer only the question that makes the relationship clear: which object is this, which state does it expose, and when was any independent copy actually made?
CHAPTER 9 OF 19 · Trace each list mutation
9. Append a new value without replacing existing values
From a fresh catalogue baseline, append b with value final choice. The list gains one tuple at its end. The two existing b entries remain, so getAll('b') now returns two words, plus+sign and final choice in that sequence.
Because this is the live associated list, the URL query is updated using its serialisation. The original space and tilde spelling can change during that update, even though append was intended to add only one logical tuple. Separate the intended data addition from the accompanying representation rewrite.
The new value final choice serialises with a plus for its space. Supplying a decoded value to append is the normal conceptual input. Pre-encoding its space as %20 would instead insert literal percent-containing data, which the serializer then represents again.
The learner's ledger should show the added tuple before the rewritten string. That makes it easier to detect whether an unexpected %25 sequence came from double representation at the input stage rather than from a mysterious browser corruption of the original phrase.
Appending is not universally the correct application operation. If the service expects one value for b, adding a third may violate its contract. The API preserves the operation requested; it does not know whether that request matches the catalogue's meaning. Verify both the resulting tuple list and the receiving field's interpretation.
CHAPTER 10 OF 19 · Trace each list mutation
10. Use set only when collapsing a name is intended
Call set('b', 'replacement') on a fresh version of the initial list. The first b tuple's value becomes replacement, and the other b tuples are removed. The a tuple remains. Set does not preserve all repeated b values while merely changing the last one.
In our baseline, the first b occupies the first list position. After set, the sequence is b=replacement followed by a=~. Its serialised live query is b=replacement&a=%7E. A later sort would change the order again, but set itself is a separate mutation.
If no b tuple existed, set would append one. The same method therefore has two branches: replace-and-remove for an existing name, or append for an absent name. A complete changed-context check includes both rather than inferring one branch from the other.
Use this operation when the application's intended field semantics call for one value. Do not choose it merely because the word set sounds like a neutral edit. In a list-valued field, the lost repeated values can be meaningful user choices.
The existing form guide already explains why a scalar map can lose repeated entries. This chapter does not rename that general lesson. It follows the particular placement and update consequences of set on a live URLSearchParams object, where tuple mutation and query reserialisation must both be traced to reconstruct the final address.
CHAPTER 11 OF 19 · Trace each list mutation
11. Delete a tuple and distinguish the remaining boundaries
Delete all b entries from a fresh original list. Only a with value ~ remains, and the live query becomes a=%7E. The path and fragment remain present. Deleting one parameter name does not mean clearing the whole URL or removing its document fragment.
The optional value argument permits matching both name and value under the current standard. In an explicit local case with x=red&x=blue&x=red, deleting x with value red removes those matching tuples while retaining x=blue. Compatibility for a deployed environment still needs the relevant check.
Deleting a name that is not present can leave the logical list unchanged while still invoking the update operation. On an associated URL, that can rewrite the existing query spelling. A no-match deletion is therefore another useful example of a list-level no-op that need not be a text-level no-op.
Do not use absence as an automatic application instruction. Removing mode can mean default mode under one service, invalid request under another or no change under an editing API. Those are receiver semantics beyond the parameter object's list operation.
For the paper audit, identify which tuples matched, which remained and which URL components changed. Then compare with the task's intention. This sequence avoids treating a successful delete method call as evidence that the visitor's desired filter state or saved resource was correctly updated everywhere.
CHAPTER 12 OF 19 · Trace each list mutation
12. Distinguish an absent query from a bare question mark
An address can have no query or an empty query represented by a trailing question mark before any fragment. These states can serialize differently even when searchParams contains no name–value tuples. The empty list is not a complete record of every distinction in the original URL text.
Take https://example.test/catalog?#list. The query is empty, and the tuple list is empty. A mutating parameter update that serialises the empty list uses a null query for the associated URL under the defined update algorithm. The resulting address can become https://example.test/catalog#list.
Likewise, deleting the final remaining tuple clears the parameter-list serialisation and removes the query marker from the associated URL. The fragment remains #list in this stipulated case. Keep those components separate rather than describing the result only as an empty address suffix.
Whether a service distinguishes a bare question mark from no query is an application and infrastructure question. The browser-side observation is the representation change. Do not claim universal semantic identity merely because both have zero parameter tuples.
This boundary demonstrates a broader information limit. A tuple copy can preserve the tuples it contains while losing an original spelling distinction that its data model does not represent. If exact original address text is required for a comparison, retain that original text as well as any parsed list.
CHAPTER 13 OF 19 · Preserve the wider contract
13. Preserve literal plus, percent and separator data
Append a parameter named note with decoded value A+B & C% D. The literal plus, ampersand, percent sign and spaces all belong to one value. The parameter serializer represents them so a later form-format parser can recover the intended value rather than treat the ampersand as another field boundary.
The resulting value spelling is A%2BB+%26+C%25+D. The plus data uses %2B; the spaces use plus; the ampersand uses %26; the percent sign uses %25. This is an original data example, not a recipe to replace a maintained serializer with manual substitutions.
Now supply the already represented text A%2BB as the decoded append value. The percent sign is data, so serialisation produces A%252BB. Parsing that once gives A%2BB, not A+B. The two append inputs were different values from the start.
A reliable function boundary states whether it accepts decoded text or an already encoded component. A name such as safeValue cannot settle that question. If two layers both assume the other expects encoded input, the same value can acquire an extra representation layer while still looking URL-like.
Use the existing path-decoding specialist for structural separators in route paths. Here the relevant grammar is the parameter list's form encoding, and the update can write back into a URL. Keep the grammars and ownership relationships explicit rather than transferring one universal decoding rule across every component.
CHAPTER 14 OF 19 · Preserve the wider contract
14. Keep name sorting separate from value ranking
Sort orders tuples by their names. It does not alphabetise each repeated name's values or infer the visitor's preferred sequence. In our original list, the two b values retain their relative order after a moves before them.
For a changed input z=last&b=second&b=first&a=start, sorting produces names in a, b, b, z order. Within b, the values remain second then first. A reader who expects first then second has silently applied an additional value-sorting policy.
The standard compares names by code units, not a locale-aware dictionary collation. A user-facing language sort and an API parameter sort can therefore be different operations. Do not promise alphabetic order appropriate to every language from this low-level method.
An application may deliberately choose a separate value order for a set-valued field. That policy should be stated and tested. It is not automatically what URLSearchParams.sort performed. Similarly, a field representing ranked preferences must preserve the intended rank rather than normalise it away for a tidier address.
For the learner, predict name order and repeated-value order in separate columns. Then ask which one the actual method is authorised to change. This makes a semantic error visible before a final serialized string hides it inside a long run of punctuation and encoded characters.
CHAPTER 15 OF 19 · Preserve the wider contract
15. Do not promote tuple equality into universal URL equivalence
Two query spellings can produce the same tuple list under the stated parser while another system distinguishes their written representations. A cache key, logging system, routing layer or application can use a different comparison rule. Its contract determines which transformations are acceptable.
Sorting may be useful under a defined cache-normalisation policy, but it is not an instruction to sort every URL that arrives. A service can assign meaning to order, repeated values or an exact signed representation. The parameter API does not negotiate that meaning with the receiver.
For an authorised design, specify the relevant equivalence: same ordered tuples, same set of field values, same application response or identical canonical text. Then test the transformation against that definition. A name such as canonicalize does not establish the promised equivalence by itself.
Avoid experimenting on a consequential or signed production URL to see whether it still works. The teaching addresses here are inert examples. Actual signature and access mechanisms require their own documentation and authorised validation; this article does not define a signing or security scheme.
The practical conclusion is neither that rewriting is always wrong nor that parsed equality makes rewriting harmless. Preserve the original, choose an explicit contract and inspect the relevant stages. A representation change can be legitimate while still requiring a different evidence claim from unchanged request identity.
CHAPTER 16 OF 19 · Preserve the wider contract
16. Separate URL-object mutation from browser navigation
Changing a URL object's searchParams changes that object. It does not by itself navigate the current page, send a request or add a browser history entry. Those later actions require the relevant navigation or history API operation in the application.
This distinction makes local examples safe and inspectable. A test can construct a URL using example.test, mutate its parameter list and compare strings without making a network request. Passing the resulting address to another API would be a separate step with its own behaviour.
A user-facing filter can therefore have several states: editable local selection, proposed URL, current browser address and server response. The application decides when to join them. Treating object mutation as completed navigation can make a test declare success before the visitor's actual journey was exercised.
The existing history-entry lesson develops Back and Forward behaviour. Do not duplicate that task here. Use the present ledger to establish the proposed address and tuple meaning first, then follow the history guide when the question concerns which entry or view the browser returns to.
For a review, record where the URL object came from, whether it is a local copy, which mutation ran and whether any later navigation was actually observed. A changed href string printed in a console is evidence about that object, not proof that the application reached the intended page or preserved a visitor's state.
CHAPTER 17 OF 19 · Practise and verify
17. Work a changed archive query independently
Try a fresh teaching address: https://example.test/archive?tag=river%20walk&mode=~&tag=A%2BB#top. Before reading the answer, write its tuple sequence, predict a live sort and predict sorting an independent copy. Keep the fragment and literal plus visible in the ledger.
The initial tuples are tag with river walk, mode with ~, and tag with A+B. A live sort produces the query mode=%7E&tag=river+walk&tag=A%2BB. The two tag values retain their relative order; the fragment remains #top.
Sorting an independent copy can produce the same parameter string without changing the original URL object. Now apply set('tag', 'new path') to that copy. Its first tag is changed and the other tag removed. The copy's sequence becomes mode with ~, then tag with new path.
If that copied result is later assigned to the original URL's search, the live URL is deliberately updated at that assignment. The transformation's commit point is no longer the earlier copy sort. Label the actual write instead of claiming the original changed when the copy was created.
Finally remove mode from the copied list and ask whether the remaining tag text proves that a real archive search succeeded. It does not. The calculation establishes a proposed query representation under the supplied rules. Search meaning and actual service outcome require their separate contract and observation.
CHAPTER 18 OF 19 · Practise and verify
18. Build an exact but bounded verification record
Preserve the original address text and the parsed tuple sequence. For every mutation, record the target object, whether it is associated with a URL, the operation and arguments, the resulting tuples and the resulting serialized text. Include the path and fragment when verifying that a query edit preserved them.
Use tests that distinguish the mechanisms. An already sorted query exposes spelling changes without reordering. Repeated names expose append versus set. Literal plus and represented percent data expose input-layer confusion. A bare query marker exposes a distinction the empty tuple list does not preserve.
Compare both exact output and semantic invariants that the exercise actually declares. An exact expected string catches punctuation and encoding differences; a tuple comparison identifies which values changed. Neither check alone establishes the receiving application's behaviour.
For a real project, document the supported runtime and API contract. Local tests can verify an implementation's URL and URLSearchParams behaviour without establishing every browser or infrastructure layer. Do not relabel a local string test as an end-to-end navigation or cache test.
This is a practical learner route as well. Begin with one name and one space, stabilise with a literal plus, then extend to a live object, repeated names and an independent copy. The progression should make each new distinction useful rather than add punctuation merely to make the example look advanced.
CHAPTER 19 OF 19 · Practise and verify
19. Repair the first changed layer and choose the next reading
If the values are right but the query spelling changed, investigate serialisation and the live update. If one repeated value disappeared, inspect the mutation or representation that collapsed it. If the old value changes after assigning search, check whether the retained parameter variable is live rather than an independent snapshot.
If a local URL string is correct but the visitor reaches the wrong view, continue beyond this article's boundary. Reference resolution, application routing, history state, server interpretation and the user journey each have a separate role. A successful tuple calculation is preparation for those checks, not a substitute for them.
Use the native form-entry guide to identify which controls contribute values before encoding. Use the path-decoding guide when component data becomes a routing boundary. Use the history guide for Back and Forward state, and the Websites root for the complete task and accountable maintenance.
A useful independent explanation can reconstruct the original catalogue sort, then solve the archive example without copying its field names. It should state which order changed, which values stayed equal, which spelling changed and which claims still need application evidence. That is more informative than saying the URL was cleaned up.
The central habit is to preserve the level at which a statement is true. Text, tuples, a live URL object and a completed navigation are related stages. Naming them lets a learner use the API confidently while keeping the reader's intended destination and the limits of the evidence in view.
Continue through the verified reading route
Construct native form entries before encoding
Construct native form entries before encoding. Identify contributing controls, repeated names, empty values and submitters before comparing their next representation.
Preserve route component boundaries
Preserve route component boundaries. Use the path-specific lesson when a decoding stage changes routing structure; keep its grammar separate from query form encoding.
Restore the intended history entry and view
Restore the intended history entry and view. Continue beyond a proposed address when Back, Forward and application view state are the real question.
Separate requestSubmit from submit in the form submission lifecycle. Follow the native form lifecycle before interpreting a later query representation. Keep validation, submitter context, event cancellation, entry construction and service outcome in separate stages.
Frequently asked questions
Did sort change the decoded data?
In the worked catalogue case it changes name order and query spelling while preserving each decoded name and value, including equal-name value order. A different mutation, such as set on a repeated name, can also remove tuples. Compare the actual list rather than treating every change as spelling only.
Does toString navigate or rewrite the URL?
Stringifying the parameter object produces its serialised list without a leading question mark. That read alone does not perform a live update or navigate the page. Mutating an associated list can update the URL object; navigation is a separate application operation.
Why is a literal plus different from a space?
The form-format parser interprets a written plus as a space, while a represented plus such as %2B becomes literal plus data. Supplying decoded text to the API avoids inventing an extra encoding layer. The path-decoding guide explains why this rule must not be copied indiscriminately to paths.
How do I preserve the original spelling?
Retain the original address text and perform exploratory mutations on an independent parameter object. A tuple copy preserves its represented values, but it cannot preserve escape-style distinctions that the list does not store. An explicit later assignment is still a commit to a new representation.
Were these addresses requested from a server?
No. The example.test addresses are inert teaching inputs. Ten focused URL and URLSearchParams checks passed in Node v24.22.1. No network, browser navigation, cache, signed-URL or device compatibility test is claimed.
Authoritative sources and further reading
WHATWG URL Standard: URLSearchParams. Primary tuple-list, association, mutation, sorting and serialisation definitions. The catalogue and archive ledgers here are original teaching examples.
Node.js URL documentation. Primary implementation documentation for the local runtime family. The recorded tests name the actual Node version and do not establish every browser’s behaviour.
Return to the Websites subject guide, The Gold Standard of Education, or the How X Works hub.