append() - это метод объекта URLSearchParams, который добавляет новый параметр в строку запроса.
Он полезен, когда нужно собрать параметры после ? и особенно когда один параметр должен встречаться несколько раз.
Например:
const params = new URLSearchParams();
params.append("tag", "js");
params.append("tag", "frontend");
console.log(params.toString()); // "tag=js&tag=frontend"
В отличие от set(), метод append() не заменяет старое значение, а добавляет ещё одну пару имя=значение.
Синтаксис
params.append(name, value)
Где:
name- имя параметраvalue- значение параметра
Метод ничего не возвращает. Он изменяет сам объект URLSearchParams.
const params = new URLSearchParams();
const result = params.append("page", "2");
console.log(result); // undefined
console.log(params.toString()); // "page=2"
Добавление одного параметра
Если параметра ещё нет, append() просто добавит его.
const params = new URLSearchParams();
params.append("q", "javascript");
params.append("page", "1");
console.log(params.toString()); // "q=javascript&page=1"
Так можно постепенно собрать строку параметров для ссылки или GET-запроса.
const params = new URLSearchParams();
params.append("category", "courses");
params.append("sort", "new");
const url = `https://learn-javascript.ru/catalog?${params.toString()}`;
console.log(url);
// "https://learn-javascript.ru/catalog?category=courses&sort=new"
Несколько значений с одним именем
Главная причина использовать append() - несколько значений у одного параметра.
Так часто передают фильтры:
const params = new URLSearchParams();
params.append("tag", "javascript");
params.append("tag", "dom");
params.append("tag", "async");
console.log(params.toString());
// "tag=javascript&tag=dom&tag=async"
В URL это выглядит как несколько одинаковых параметров:
https://learn-javascript.ru/search?tag=javascript&tag=dom&tag=async
Это нормальная форма записи. Сервер или ваш код могут прочитать все значения с помощью getAll().
const params = new URLSearchParams("tag=javascript&tag=dom&tag=async");
console.log(params.getAll("tag")); // ["javascript", "dom", "async"]
Если использовать get(), вернётся только первое значение.
console.log(params.get("tag")); // "javascript"
append() и set()
append() и set() похожи тем, что оба добавляют параметр, если его ещё нет.
Разница появляется, когда параметр уже существует.
append() добавляет новое значение:
const params = new URLSearchParams("tag=javascript");
params.append("tag", "dom");
console.log(params.toString()); // "tag=javascript&tag=dom"
set() заменяет значение и удаляет остальные значения с таким же именем:
const params = new URLSearchParams("tag=javascript&tag=dom");
params.set("tag", "async");
console.log(params.toString()); // "tag=async"
Практическое правило простое:
- нужен один параметр
page=2- чаще подходитset() - нужны несколько фильтров
tag=js&tag=dom- подходитappend()
Использование вместе с URL
Чаще всего append() используют через свойство searchParams у объекта URL.
const url = new URL("https://learn-javascript.ru/search");
url.searchParams.append("tag", "javascript");
url.searchParams.append("tag", "functions");
console.log(url.href);
// "https://learn-javascript.ru/search?tag=javascript&tag=functions"
Так удобнее, чем вручную добавлять ?, & и =.
Например, можно собрать ссылку на страницу поиска:
function createSearchUrl(tags) {
const url = new URL("https://learn-javascript.ru/search");
for (const tag of tags) {
url.searchParams.append("tag", tag);
}
return url.href;
}
console.log(createSearchUrl(["javascript", "array"]));
// "https://learn-javascript.ru/search?tag=javascript&tag=array"
Значения становятся строками
Параметры URL - это строки. Поэтому значения, переданные в append(), будут преобразованы к строке.
const params = new URLSearchParams();
params.append("page", 2);
params.append("active", true);
console.log(params.toString()); // "page=2&active=true"
Обычно лучше делать преобразование явно, чтобы код было проще читать.
const page = 2;
params.append("page", String(page));
Кодирование значений
Если значение содержит пробелы, русские буквы или специальные символы, URLSearchParams сам подготовит его для URL.
const url = new URL("https://learn-javascript.ru/search");
url.searchParams.append("q", "уроки javascript");
console.log(url.searchParams.get("q")); // "уроки javascript"
Внутри адреса значение будет закодировано так, чтобы URL оставался корректным. При чтении через get() или getAll() вы получите обычную строку.
Порядок добавления сохраняется
append() добавляет параметр в конец списка.
const params = new URLSearchParams();
params.append("q", "javascript");
params.append("tag", "dom");
params.append("tag", "events");
params.append("page", "2");
console.log(params.toString());
// "q=javascript&tag=dom&tag=events&page=2"
Обычно порядок параметров не влияет на работу запроса, но он важен, если вы выводите строку, сравниваете её в тестах или хотите получить предсказуемый URL.
Частые ошибки
Использовать append(), когда нужно заменить значение
const params = new URLSearchParams("page=1");
params.append("page", "2");
console.log(params.toString()); // "page=1&page=2"
Если страница должна быть только одна, используйте set().
params.set("page", "2");
Читать только get(), когда значений несколько
const params = new URLSearchParams("tag=javascript&tag=dom");
console.log(params.get("tag")); // "javascript"
get() возвращает первое значение. Чтобы получить все значения, нужен getAll().
console.log(params.getAll("tag")); // ["javascript", "dom"]
Быстрая памятка
append()добавляет параметр вURLSearchParams- метод изменяет текущий объект и возвращает
undefined - если параметр уже есть, старое значение не удаляется
- для нескольких одинаковых параметров используйте
append() - для замены одного значения чаще нужен
set() - все значения параметров становятся строками
URLSearchParamsсам кодирует значения для URL- все значения одного параметра можно получить через
getAll()
Коротко
append() нужен, чтобы добавить параметр в URLSearchParams без замены старых значений. Он особенно полезен для фильтров и других случаев, где один ключ может повторяться несколько раз: tag=javascript&tag=dom. Если параметр должен быть только один, чаще удобнее использовать set().