Когда дело доходит до глубокого копирования объектов JavaScript, разработчики часто полагаются на методы JSON.stringify и JSON.parse для достижения желаемого результата. Однако эти методы могут быть неэффективными и некорректно обрабатывать определенные типы данных. В этой статье мы рассмотрим семь альтернативных методов глубокого копирования объектов JavaScript без использования JSON.stringify и JSON.parse. Эти методы предоставят вам больше контроля, повышенную производительность и лучшую совместимость в различных сценариях.
Метод 1: Object.assign
const originalObj = { name: 'John', age: 25 };
const copiedObj = Object.assign({}, originalObj);
Метод 2: оператор расширения
const originalObj = { name: 'John', age: 25 };
const copiedObj = { ...originalObj };
Метод 3: Object.create
const originalObj = { name: 'John', age: 25 };
const copiedObj = Object.create(Object.getPrototypeOf(originalObj), Object.getOwnPropertyDescriptors(originalObj));
Метод 4: Lodash.cloneDeep
const originalObj = { name: 'John', age: 25 };
const copiedObj = _.cloneDeep(originalObj);
Метод 5: JSON.parse с функцией восстановления
const originalObj = { name: 'John', age: 25 };
const copiedObj = JSON.parse(JSON.stringify(originalObj), (key, value) => value);
Метод 6: рекурсивная функция
function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
const copy = Array.isArray(obj) ? [] : {};
Object.keys(obj).forEach(key => {
copy[key] = deepCopy(obj[key]);
});
return copy;
}
const originalObj = { name: 'John', age: 25 };
const copiedObj = deepCopy(originalObj);
Метод 7. Алгоритм структурированного клонирования (для Web Workers и Node.js)
const { isMainThread, Worker } = require('worker_threads');
if (isMainThread) {
const originalObj = { name: 'John', age: 25 };
const worker = new Worker(__filename);
worker.on('message', copiedObj => {
// Use the copied object
console.log(copiedObj);
});
worker.postMessage(originalObj);
} else {
const { parentPort } = require('worker_threads');
parentPort.on('message', originalObj => {
const copiedObj = originalObj; // Structured cloning happens automatically
parentPort.postMessage(copiedObj);
});
}
В этой статье мы рассмотрели семь различных методов глубокого копирования объектов JavaScript без использования JSON.stringify и JSON.parse. Эти методы обеспечивают большую гибкость, улучшенную производительность и лучшую совместимость с различными типами данных. Понимая эти альтернативы, вы можете выбрать наиболее подходящий подход для ваших конкретных требований. При выборе подходящего метода глубокого копирования для вашего проекта не забывайте учитывать такие факторы, как производительность, поддержка браузеров и читаемость кода.