HarmonyOS 鸿蒙Next中深拷贝/浅拷贝
HarmonyOS 鸿蒙Next中深拷贝/浅拷贝 https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkts-93-V5
浅拷贝:
- 在堆中为新对象重新创建内存空间。
- 基本数据类型的值被直接拷贝,互不影响。
- 引用类型的内存地址被拷贝,因此拷贝前后的对象共享相同的引用类型数据。
- 修改共享引用类型的数据会影响所有指向该数据的对象。
深拷贝:
- 完整地从内存中拷贝一个对象,包括其所有属性和嵌套的对象。
- 在堆内存中开辟新的区域来存储新对象,确保新对象和原始对象完全独立。
- 修改新对象不会影响原始对象,反之亦然。
对象赋值:
- 当一个对象赋值给新变量时,实际上复制的是对象在栈中的内存地址,而不是堆中的数据。
- 两个变量指向同一个堆内存空间,对一个变量的修改会影响另一个变量,因为它们共享存储空间。
https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkts-94-V5
-
浅拷贝实现方法:
通过ts封装Object.assign()或者使用三方库lodash的_.clone方法。封装Object.assign()示例如下:
ts封装Object.assign():
export class ObjectUtil { static Assign<T extends {}, U>(target: T, source: U): T & U { return Object.assign(target, source); } }
ets文件中使用封装的ObjectUtil:
import { ObjectUtil } from './utils'; interface InnerStudent { age: number, score: number } interface Student { name: string, data: InnerStudent } let obj1: Student = { name: 'obj1', data: { age: 24, score: 100 } }; let obj2 = ObjectUtil.Assign({}, obj1); obj2.name = 'obj2'; obj2.data.age = 12; obj2.data.score = 50; [@Entry](/user/Entry) [@Component](/user/Component) struct Index { build() { Row() { Column() { Button('get obj') .onClick(() => { console.log('obj1:', JSON.stringify(obj1)); // obj1: {"name":"obj1","data":{"age":12,"score":50}} console.log('obj2:', JSON.stringify(obj2)); // obj2: {"name":"obj2","data":{"age":12,"score":50}} }) } .width('100%') }.height('100%') } }
-
深拷贝实现方法:
-
JSON.parse(JSON.stringify()),对于undefined等无法序列化的数据会丢失。
-
三方库lodash的_.cloneDeep方法。
-
手写递归方法:
// ts中封装工具函数 export function deepCopy(obj: ESObject): ESObject { if (typeof obj !== 'object' || obj === null) { return obj; } let copy: ESObject; if (Array.isArray(obj)) { copy = []; for (let i = 0; i < obj.length; i++) { copy[i] = deepCopy(obj[i]); } } else { copy = {}; for (let i = 0; i < obj.length(); i++) { let key: ESObject = obj[i]; if (obj.hasOwnProperty(key)) { copy[key] = deepCopy(obj[key]); } } } return copy; }
// 使用封装的工具函数 import { deepCopy } from './utils'; let arr1:Array<number> = new Array<number>(1, 2, 3); let arr2:Array<number> = deepCopy(arr1); arr2[0] = 4; arr2[1] = 5; arr2[2] = 6; [@Entry](/user/Entry) [@Component](/user/Component) struct Index { build() { Row() { Column() { Button('deep copy') .onClick(() => { console.log('arr1:', JSON.stringify(arr1)); // arr1: [1,2,3] console.log('arr2:', JSON.stringify(arr2)); // arr2: [4,5,6] }) } .width('100%') }.height('100%') } }
-
更多关于HarmonyOS 鸿蒙Next中深拷贝/浅拷贝的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,深拷贝和浅拷贝是对象复制的两种方式。浅拷贝仅复制对象的引用,不创建新对象,原对象与拷贝对象共享数据。深拷贝会创建新对象并递归复制所有属性,确保原对象与拷贝对象完全独立。鸿蒙Next中通过ArkTS语言实现,支持结构化克隆机制进行深拷贝操作。
更多关于HarmonyOS 鸿蒙Next中深拷贝/浅拷贝的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,深拷贝和浅拷贝的实现与标准TypeScript/JavaScript一致。浅拷贝通过Object.assign()或lodash的_.clone实现,仅复制对象的第一层属性,嵌套对象仍共享引用。深拷贝通过JSON.parse(JSON.stringify())、lodash的_.cloneDeep或递归函数实现,完全复制所有层级数据,确保对象独立。需注意JSON方法会丢失undefined等不可序列化数据。根据业务需求选择合适方式,避免意外数据共享。