JSON.stringify() превращает значение JavaScript в JSON-строку.
Чаще всего его используют, когда нужно:
- сохранить данные в
localStorage - отправить объект на сервер
- превратить объект в строку для хранения или передачи
Синтаксис
Базовая запись выглядит так:
JSON.stringify(value, replacer, space)
Где:
value- значение, которое нужно превратить в JSON-строкуreplacer- необязательная настройка для отбора или преобразования свойствspace- необязательная настройка для красивого форматирования строки
Что возвращает JSON.stringify()
Метод возвращает строку.
const user = {
name: "Анна",
age: 25,
};
const json = JSON.stringify(user);
console.log(json);
// '{"name":"Анна","age":25}'
console.log(typeof json); // "string"
Это важно: результатом будет именно строка, а не объект.
Пример с объектом
Самый частый сценарий - превратить объект в JSON-строку.
const product = {
title: "Ноутбук",
price: 120000,
inStock: true,
};
console.log(JSON.stringify(product));
// '{"title":"Ноутбук","price":120000,"inStock":true}'
Пример с массивом
Массивы тоже спокойно превращаются в JSON.
const numbers = [1, 2, 3];
console.log(JSON.stringify(numbers));
// "[1,2,3]"
С вложенными структурами это тоже работает.
const data = {
user: "Анна",
skills: ["HTML", "CSS", "JavaScript"],
};
console.log(JSON.stringify(data));
// '{"user":"Анна","skills":["HTML","CSS","JavaScript"]}'
JSON.stringify() и красивые отступы
Третий аргумент space позволяет сделать JSON читаемым.
const user = {
name: "Анна",
age: 25,
city: "Москва",
};
console.log(JSON.stringify(user, null, 2));
Результат будет таким:
{
"name": "Анна",
"age": 25,
"city": "Москва"
}
Это особенно удобно для логов, отладки и сохранения данных в более читаемом виде.
Второй аргумент replacer
replacer позволяет управлять тем, какие свойства попадут в итоговую строку.
Например, можно оставить только часть полей:
const user = {
name: "Анна",
age: 25,
password: "123456",
};
console.log(JSON.stringify(user, ["name", "age"]));
// '{"name":"Анна","age":25}'
Такой вариант полезен, когда нужно явно исключить лишние поля.
replacer как функция
Второй аргумент может быть и функцией.
const user = {
name: "Анна",
password: "123456",
};
const json = JSON.stringify(user, (key, value) => {
if (key === "password") {
return undefined;
}
return value;
});
console.log(json);
// '{"name":"Анна"}'
Это уже более гибкий способ управлять сериализацией.
Что происходит со строками, числами и boolean
Примитивы тоже преобразуются в JSON-строку.
console.log(JSON.stringify("JavaScript")); // '"JavaScript"'
console.log(JSON.stringify(123)); // "123"
console.log(JSON.stringify(true)); // "true"
console.log(JSON.stringify(null)); // "null"
Обратите внимание: строка в JSON получает двойные кавычки.
Что происходит с undefined, функциями и Symbol
Здесь есть важный нюанс.
Если такие значения находятся в объекте, они просто не попадут в результат.
const user = {
name: "Анна",
age: undefined,
sayHi() {},
id: Symbol("id"),
};
console.log(JSON.stringify(user));
// '{"name":"Анна"}'
Если такие значения находятся в массиве, они превращаются в null.
const values = [1, undefined, function () {}, Symbol("id")];
console.log(JSON.stringify(values));
// "[1,null,null,null]"
А если передать такое значение напрямую, результатом будет undefined.
console.log(JSON.stringify(undefined)); // undefined
console.log(JSON.stringify(function () {})); // undefined
Что происходит с NaN и Infinity
Эти значения в JSON напрямую не поддерживаются, поэтому превращаются в null.
console.log(JSON.stringify(NaN)); // "null"
console.log(JSON.stringify(Infinity)); // "null"
console.log(JSON.stringify(-Infinity)); // "null"
То же самое произойдёт и внутри объектов или массивов.
Что происходит с Date
Объект Date превращается в строку.
const date = new Date("2025-01-15T10:00:00Z");
console.log(JSON.stringify(date));
// '"2025-01-15T10:00:00.000Z"'
Если Date лежит внутри объекта, в JSON попадёт именно строка даты.
Ошибка с циклическими ссылками
JSON.stringify() не умеет работать с циклическими ссылками.
const user = {
name: "Анна",
};
user.self = user;
// JSON.stringify(user); // TypeError
Если объект ссылается сам на себя напрямую или через цепочку, метод выбросит ошибку.
Ошибка с BigInt
BigInt тоже не сериализуется обычным JSON.stringify().
const value = 10n;
// JSON.stringify(value); // TypeError
Это ещё одна частая ловушка, если в данных есть большие целые числа.
JSON.stringify() и String() - не одно и то же
Эти вещи иногда путают.
const user = { name: "Анна" };
console.log(String(user)); // "[object Object]"
console.log(JSON.stringify(user)); // '{"name":"Анна"}'
String() просто делает строковое представление значения.
JSON.stringify() строит JSON-строку по правилам JSON.
Когда это полезно
JSON.stringify() особенно удобен, когда:
- нужно сохранить объект в
localStorage - надо отправить данные на сервер
- хочется вывести объект в читаемом виде
- нужно превратить массив или объект в строку для хранения
Пример с localStorage:
const settings = {
theme: "dark",
lang: "ru",
};
localStorage.setItem("settings", JSON.stringify(settings));
Частые ошибки
Думать, что метод возвращает объект
const user = { name: "Анна" };
const result = JSON.stringify(user);
console.log(typeof result); // "string"
Результат - строка, а не объект.
Путать JSON-строку и обычную строку
console.log(JSON.stringify("JavaScript"));
// '"JavaScript"'
Внутри JSON строковые значения записываются в двойных кавычках.
Ожидать, что undefined сохранится как есть
const user = {
name: "Анна",
age: undefined,
};
console.log(JSON.stringify(user));
// '{"name":"Анна"}'
Свойства со значением undefined в объекте просто исчезают.
Забывать про циклические ссылки
const obj = {};
obj.self = obj;
// JSON.stringify(obj); // TypeError
Если в данных есть ссылка на самих себя, метод не сработает.
Использовать JSON.stringify() как глубокую копию “на все случаи”
Иногда так делают:
const copy = JSON.parse(JSON.stringify(data));
Для простых данных это может сработать, но при Date, undefined, BigInt, функциях, Infinity и других особых значениях результат будет искажён или вообще приведёт к ошибке.
Быстрая памятка
JSON.stringify()превращает значение JavaScript в JSON-строку- результатом почти всегда будет строка
- третий аргумент
spaceдобавляет красивые отступы - второй аргумент
replacerпозволяет фильтровать или менять значения undefined, функции иSymbolв объектах пропускаютсяundefined, функции иSymbolв массивах превращаются вnullNaNиInfinityпревращаются вnull- циклические ссылки вызывают ошибку
BigIntобычныйJSON.stringify()не поддерживает
Коротко
JSON.stringify() в JavaScript нужен, чтобы превратить объект, массив или другое значение в JSON-строку. Главное, что стоит запомнить: это очень полезный метод для хранения и передачи данных, но у него есть важные ограничения с undefined, функциями, циклическими ссылками и BigInt.