返回

解读深拷贝与浅拷贝:掌握差异,灵活运用

前端

深拷贝与浅拷贝的本质区别

  • 浅拷贝:

    • 复制对象引用,而非对象本身
    • 更改新对象的属性值不会影响原始对象
    • 创建新对象的速度更快
    • 占用更少的内存
  • 深拷贝:

    • 创建原始对象的新副本,包括所有属性的值
    • 更改新对象的属性值也会影响原始对象
    • 创建新对象的速度较慢
    • 占用更多的内存

何时使用深拷贝和浅拷贝

  • 浅拷贝:

    • 当需要快速创建对象的副本时
    • 当对象不包含任何引用类型属性时
    • 当对象很大时,深拷贝可能需要花费大量时间和内存
  • 深拷贝:

    • 当需要创建对象的完全独立副本时
    • 当对象包含引用类型属性时
    • 当需要确保更改新对象的属性值不会影响原始对象时

JavaScript中的深拷贝和浅拷贝

  • 浅拷贝:

    let obj1 = {
        name: "John Doe",
        age: 30
    };
    
    let obj2 = obj1; // 浅拷贝
    
    obj2.name = "Jane Doe"; // 更改 obj2.name 的值
    
    console.log(obj1.name); // 输出:"Jane Doe"
    
  • 深拷贝:

    let obj1 = {
        name: "John Doe",
        age: 30
    };
    
    let obj2 = JSON.parse(JSON.stringify(obj1)); // 深拷贝
    
    obj2.name = "Jane Doe"; // 更改 obj2.name 的值
    
    console.log(obj1.name); // 输出:"John Doe"
    

Python中的深拷贝和浅拷贝

  • 浅拷贝:

    obj1 = {"name": "John Doe", "age": 30}
    
    obj2 = obj1 # 浅拷贝
    
    obj2["name"] = "Jane Doe" # 更改 obj2["name"] 的值
    
    print(obj1["name"]) # 输出:"Jane Doe"
    
  • 深拷贝:

    import copy
    
    obj1 = {"name": "John Doe", "age": 30}
    
    obj2 = copy.deepcopy(obj1) # 深拷贝
    
    obj2["name"] = "Jane Doe" # 更改 obj2["name"] 的值
    
    print(obj1["name"]) # 输出:"John Doe"
    

总结

  • 深拷贝和浅拷贝是两种不同的数据拷贝方法,它们在创建新对象副本的方式、速度和内存占用方面存在差异。

  • 在 JavaScript 和 Python 中,可以使用不同的方法实现深拷贝和浅拷贝。

  • 选择使用深拷贝还是浅拷贝取决于具体的需求和性能要求。