Какой есть нюанс при копировании объекта через JSON.stringify
1️⃣ Как кратко ответить
Копирование объекта через JSON.stringify и JSON.parse не сохраняет функции, undefined, символы, свойства с нечисловыми ключами в массиве, а также теряет информацию о прототипах и специальных объектах, таких как Date, Map, Set.
2️⃣ Подробное объяснение темы
Копирование объекта в JavaScript — это процесс создания нового объекта, который имеет те же значения, что и исходный объект. Один из способов глубокого копирования объекта — это использование JSON.stringify и JSON.parse. Однако этот метод имеет свои ограничения и нюансы.
Как это работает
- JSON.stringify: Преобразует объект в строку формата JSON.
- JSON.parse: Преобразует строку JSON обратно в объект.
Пример:
const original = { a: 1, b: { c: 2 } };
const copy = JSON.parse(JSON.stringify(original));
original— исходный объект.copy— новый объект, который является глубоким клономoriginal.
Нюансы и ограничения
-
Функции и
undefined: При сериализации объекта с помощьюJSON.stringify, функции и значенияundefinedне сохраняются. Они просто игнорируются.const obj = { a: 1, b: undefined, c: function() { return 2; } }; const jsonString = JSON.stringify(obj); // Результат: '{"a":1}'bиcне включены вjsonString, так какundefinedи функции не поддерживаются в JSON.
-
Символы: Символы также не сериализуются.
const obj = { a: 1, [Symbol('b')]: 2 }; const jsonString = JSON.stringify(obj); // Результат: '{"a":1}'- Свойство с символом как ключом не включено в
jsonString.
- Свойство с символом как ключом не включено в
-
Прототипы: Информация о прототипах объектов теряется. Новый объект будет иметь прототип
Object.function MyClass() { this.a = 1; } MyClass.prototype.b = 2; const instance = new MyClass(); const copy = JSON.parse(JSON.stringify(instance)); console.log(copy.b); // Результат: undefinedcopyне имеет доступа к свойствуb, так как прототип не был скопирован.
-
Специальные объекты: Объекты типа
Date,Map,Set,RegExpи другие специальные объекты не сохраняются корректно.const obj = { date: new Date(), map: new Map(), set: new Set() }; const copy = JSON.parse(JSON.stringify(obj)); console.log(copy.date instanceof Date); // Результат: false console.log(copy.map instanceof Map); // Результат: false console.log(copy.set instanceof Set); // Результат: falsecopy.dateбудет строкой, а не объектомDate.copy.mapиcopy.setбудут пустыми объектами.
Когда использовать
Использование JSON.stringify и JSON.parse для копирования объектов подходит для простых объектов, которые содержат только данные, поддерживаемые JSON (числа, строки, массивы, объекты). Это быстрый и простой способ глубокого копирования, но он не подходит для объектов с функциями, undefined, символами, прототипами или специальными объектами.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться