В js концепции глубокого клонирования и поверхностного клонирования, а также написание функции глубокого клонирования вручную

В JavaScript клонирование — это дублирование объекта для повторного использования его свойств и методов. Поверхностное клонирование и глубокое клонирование — два распространенных метода клонирования.

Неглубокое клонирование заключается в копировании ссылки на объект.Фактически копируются только базовые атрибуты объекта, то есть атрибуты первого уровня объекта.Если атрибут объекта является ссылочным типом, выполняется только поверхностное клонирование копирует ссылку, но не копирует сам объект. Это означает, что два объекта совместно используют свойство одного и того же ссылочного типа, и если один объект изменяет свойство этого ссылочного типа, это также влияет на другой объект. Неглубокое клонирование можно выполнить с помощью Object.assign() или спреда (…).

Например:

const person = {
  name: 'John',
  age: 30,
  address: {
    country: 'USA',
    city: 'New York'
  }
};
const shallowClone = Object.assign({}, person);
console.log(shallowClone === person); // false
console.log(shallowClone.address === person.address); // true

Глубокое клонирование заключается в копировании всего объекта, включая его основные свойства и свойства ссылочного типа. Глубокий клон рекурсивно копирует все вложенные свойства объекта, поэтому каждый объект и все его дочерние элементы являются совершенно новыми, каждый с другим адресом памяти. Глубокое клонирование обычно реализуется с помощью рекурсивных функций или сторонних библиотек, таких как Lodash или jQuery. Глубокое клонирование также может вызвать проблемы с производительностью, поскольку рекурсивное копирование всего дерева объектов может занять много времени.

Например:

function deepClone(obj) {
  // 如果是基本类型则直接返回
  if (typeof obj !== "object" || obj === null) {
    return obj;
  }
  // 根据obj的类型创建一个数组或者对象
  let newObj = Array.isArray(obj) ? [] : {};
  // 遍历obj,并赋值给newObj
  for (let key in obj) {
    newObj[key] = deepClone(obj[key]);
  }
  return newObj;
}

В некоторых случаях также можно использовать JSON.parse(JSON.stringify(obj)) Причина, по которой в некоторых случаях говорится об этом, заключается в том, что при использовании этого метода, если объект содержит такие свойства, как функции, даты и регулярные выражения , это свойство преобразуется в значение null.

おすすめ

転載: blog.csdn.net/qq_68155756/article/details/130560349
おすすめ