返回

不要再问我JS Clone的问题了

前端

用clone()方法

JavaSript的clone()方法可以快速轻松地复制对象。然而,重要的是要注意,clone()只进行浅拷贝,这意味着它只复制对象本身,而不复制对象的属性。

const original = {
  name: "John",
  age: 30,
  address: {
    street: "123 Main St",
    city: "Anytown",
    state: "CA",
    zip: "12345"
  }
};

const clone = original.clone();

clone.name = "Jane";
clone.address.street = "456 Elm St";

console.log(original);
// { name: 'John', age: 30, address: { street: '456 Elm St', city: 'Anytown', state: 'CA', zip: '12345' } }

正如您所看到的,对clone的更改也会反映在original中,这是因为clone()只复制了对象的引用,而不是属性值本身。

使用深度优先搜索算法

为了创建一个深度克隆,您需要使用深度优先搜索算法。该算法将遍历对象及其所有属性,并创建一个包含所有原始值的新对象。

function deepClone(obj) {
  if (typeof obj !== "object" || obj === null) {
    return obj;
  }

  const clone = {};

  for (const key in obj) {
    clone[key] = deepClone(obj[key]);
  }

  return clone;
}

const original = {
  name: "John",
  age: 30,
  address: {
    street: "123 Main St",
    city: "Anytown",
    state: "CA",
    zip: "12345"
  }
};

const clone = deepClone(original);

clone.name = "Jane";
clone.address.street = "456 Elm St";

console.log(original);
// { name: 'John', age: 30, address: { street: '123 Main St', city: 'Anytown', state: 'CA', zip: '12345' } }

正如您所看到的,对clone的更改不会反映在original中,这是因为deepClone()创建了一个新对象,该对象包含原始值的新副本。

使用JSON

另一种创建深度克隆的方法是使用JSON。JSON.stringify()方法将对象转换为JSON字符串,然后JSON.parse()方法可以将JSON字符串转换回对象。

const original = {
  name: "John",
  age: 30,
  address: {
    street: "123 Main St",
    city: "Anytown",
    state: "CA",
    zip: "12345"
  }
};

const clone = JSON.parse(JSON.stringify(original));

clone.name = "Jane";
clone.address.street = "456 Elm St";

console.log(original);
// { name: 'John', age: 30, address: { street: '123 Main St', city: 'Anytown', state: 'CA', zip: '12345' } }

正如您所看到的,对clone的更改不会反映在original中,这是因为JSON.stringify()和JSON.parse()创建了一个新对象,该对象包含原始值的新副本。

结论

在本文中,我们探讨了JavaScript中对象克隆的不同方法。我们看到了clone()方法的局限性,并演示了如何使用深度优先搜索算法和JSON来创建深度克隆。我希望本文对您有所帮助,如果您有任何问题,请随时留言。