HarmonyOS 鸿蒙Next中如何实现深/浅拷贝
HarmonyOS 鸿蒙Next中如何实现深/浅拷贝
- 浅拷贝实现方法:
- 通过ts封装
Object.assign()或者使用三方库lodash的_.clone方法。封装Object.assign()示例如下:
- 通过ts封装
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
@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 key in obj) {
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
@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中,深拷贝和浅拷贝的实现依赖于对象的数据结构和具体需求。浅拷贝是复制对象的引用,深拷贝是复制对象的所有内容。
-
浅拷贝:可以通过直接赋值或使用
Object.assign()方法实现。例如:let original = { a: 1, b: { c: 2 } }; let shallowCopy = Object.assign({}, original); -
深拷贝:可以使用
JSON.parse(JSON.stringify())方法或递归复制对象的所有属性来实现。例如:let original = { a: 1, b: { c: 2 } }; let deepCopy = JSON.parse(JSON.stringify(original));
对于复杂对象,递归复制更为可靠:
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;
}
在实际开发中,选择深拷贝还是浅拷贝取决于是否需要复制嵌套对象的引用。
更多关于HarmonyOS 鸿蒙Next中如何实现深/浅拷贝的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS(鸿蒙)Next中,深/浅拷贝的实现方式与其他编程语言类似,主要依赖于对象的复制行为。
-
浅拷贝:浅拷贝只复制对象本身,不复制对象内部的引用对象。在HarmonyOS中,可以通过
Object.assign()或扩展运算符{...obj}来实现浅拷贝。例如:let original = { a: 1, b: { c: 2 } }; let shallowCopy = { ...original }; -
深拷贝:深拷贝会递归复制对象及其内部的所有引用对象。在HarmonyOS中,可以使用
JSON.parse(JSON.stringify(obj))来实现简单的深拷贝,但这种方法不支持函数、undefined等特殊类型。对于复杂对象的深拷贝,建议使用第三方库如lodash的cloneDeep方法。例如:let original = { a: 1, b: { c: 2 } }; let deepCopy = JSON.parse(JSON.stringify(original));
选择深/浅拷贝应根据具体需求,深拷贝适用于需要完全独立的副本,而浅拷贝适用于不需要完全独立的情况。

