您现在的位置是:网站首页 > 深拷贝与浅拷贝文章详情

深拷贝与浅拷贝

陈川 JavaScript 6421人已围观

在编程领域中,尤其是对象导向编程,对象的复制是一个常见的操作。然而,复制并非总是简单的赋值过程,它涉及到如何处理对象内部的数据结构和引用。在这个过程中,有两种主要的复制方式:浅拷贝和深拷贝。

浅拷贝

浅拷贝是指创建一个新对象,并将原始对象的引用复制到新对象中。这种情况下,如果原始对象包含其他对象作为其属性,那么新对象也将包含这些对象的引用,而不是它们的副本。因此,如果原始对象中的任何属性被修改,新对象也会受到影响,因为它们共享相同的引用。

示例代码(JavaScript)

function shallowCopy(obj) {
    return { ...obj };
}

const original = { name: "Alice", age: 30, address: { city: "New York" } };
const copied = shallowCopy(original);

// 修改原始对象的地址信息
original.address.city = "Los Angeles";

console.log(copied); // 输出: { name: 'Alice', age: 30, address: { city: 'Los Angeles' } }

在这个例子中,我们使用了扩展运算符(...)来创建一个对象的浅拷贝。可以看到,虽然名字和年龄没有改变,但地址的city属性已经从New York改为了Los Angeles,这是因为address对象也被浅拷贝了引用。

深拷贝

深拷贝则是创建一个新对象,并递归地复制原始对象及其所有嵌套的对象或数组。这意味着新对象不仅包含了原始对象的值,还包括了所有嵌套对象的完全复制,而不是引用。因此,对新对象的任何修改都不会影响原始对象。

示例代码(JavaScript)

function deepCopy(obj) {
    if (typeof obj !== 'object' || obj === null) {
        return obj;
    }

    let copy = Array.isArray(obj) ? [] : {};

    for (let key in obj) {
        copy[key] = deepCopy(obj[key]);
    }

    return copy;
}

const original = { name: "Alice", age: 30, address: { city: "New York" } };
const copied = deepCopy(original);

// 修改复制对象的地址信息
copied.address.city = "Los Angeles";

console.log(original); // 输出: { name: 'Alice', age: 30, address: { city: 'Los Angeles' } }

在这段代码中,我们定义了一个deepCopy函数,它递归地遍历输入对象的所有属性,并使用自身调用来复制每个属性。这样,即使原始对象中的address对象被修改,复制对象copied仍然保持了原始地址信息New York

总结

浅拷贝和深拷贝的主要区别在于它们如何处理嵌套的对象或数组。浅拷贝只是复制了对象的表面层次,而深拷贝则深入地复制了整个对象结构,包括所有嵌套的对象。选择哪种方式取决于你的具体需求,比如是否需要避免修改原始数据的影响,或者是否需要在不影响原数据的情况下修改某些特定部分。

我的名片

网名:川

职业:前端开发工程师

现居:四川省-成都市

邮箱:chuan@chenchuan.com

站点信息

  • 建站时间:2017-10-06
  • 网站程序:Koa+Vue
  • 本站运行
  • 文章数量
  • 总访问量
  • 微信公众号:扫描二维码,关注我
微信公众号
每次关注
都是向财富自由迈进的一步