深拷贝 赋值

        // 实现克隆Clone
        // let obj = new window[this._type];
        // let obj = DObject.deepCopy(this);
        // let obj = this.constructor();
        let obj = Class.createObject(this._type, false);

1. new window[type] 

    要确保type 就是类名,否则出错。

2. DObject.deepCopy(this);

    深拷贝自己实现.

3. this.constructor();

    因为是this 调用constructor(),可能会修改this 本身,导致错误.

4. createObject 利用工厂模式克隆构造对象;

除了深拷贝外,其他方法都要进行 assign 赋值,赋值要注意值引用.

### 数组的深拷贝实现方式 在编程中,数组的深拷贝意味着创建一个新数组,其中包含原始数组中所有元素的独立副本。这意味着修改新数组不会影响原始数组。以下是几种不同编程语言中实现数组深拷贝的方式。 #### JavaScript 中的深拷贝 1. **使用 `for` 循环手动复制** 可以通过遍历数组的每个元素并将其逐个复制到新数组中来实现深拷贝。这种方式适用于简单的数组结构。 ```javascript var arr = [1, 2, 3, 4, 5]; function copyArr(arr) { let res = []; for (let i = 0; i < arr.length; i++) { res.push(arr[i]); } return res; } var arr2 = copyArr(arr); ``` 2. **使用 `slice` 方法** `slice` 方法可以创建一个新数组,并返回指定数组的一部分。由于它不会修改原数组,因此可以用于创建数组的浅拷贝,对于基本类型数组而言,这等同于深拷贝。 ```javascript var arr = [1, 2, 3, 4, 5]; var arr2 = arr.slice(); ``` #### Python 中的深拷贝 在 Python 中,可以使用 `copy` 模块中的 `deepcopy` 函数来实现数组(或列表)的深拷贝。 ```python import copy a = [1, 2, 3, 4, 5] d = copy.deepcopy(a) # 深拷贝 a.append(6) # 修改原始数组 print("a =", a) print("d =", d) ``` 此方法确保即使数组中包含嵌套结构,也会递归地复制所有层级,确保新数组完全独立于原数组。 #### C++ 中的深拷贝 在 C++ 中,结构体中的数组可以直接赋值,这会自动执行深拷贝。例如: ```cpp #include <iostream> #include <cstring> using namespace std; struct A { char a[10]; }; int main() { A a1; strcpy(a1.a, "aaa"); A a2 = a1; // 深拷贝 cout << "a1.a: " << a1.a << ", a2.a: " << a2.a << endl; cout << "Addresses: a1.a: " << (void*)a1.a << ", a2.a: " << (void*)a2.a << endl; return 0; } ``` 在此示例中,`a2 = a1;` 会复制 `a1` 的所有内容,并且 `a2.a` 和 `a1.a` 指向不同的内存地址,因此它们是独立的数组。 #### PHP 中的深拷贝 在 PHP 中,可以通过序列化和反序列化来实现数组的深拷贝: ```php $arr = [1, 2, 3, 4, 5]; $arr2 = unserialize(serialize($arr)); ``` 这种方法适用于数组和对象,确保所有嵌套结构也被独立复制。 --- ### 总结 - **JavaScript** 提供了 `for` 循环和 `slice` 等方法来实现数组的深拷贝。 - **Python** 提供了 `copy.deepcopy()` 函数来处理复杂结构的深拷贝。 - **C++** 中结构体内的数组可以直接赋值,自动实现深拷贝。 - **PHP** 可以通过 `serialize` 和 `unserialize` 来实现数组的深拷贝。 选择合适的深拷贝方法取决于具体编程语言及其数据结构的复杂性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值