在JS里,除Array和Object之外的数据类型的复制可以直接通过等号=来实现,但Array和Object类型的数据通过等号只是起引用作用,指向的是同一块内存地址。当源数据改变,引用的数据也同时会发生变化。因此若要复制这两类数据类型就必须对它们里边的每一个元素都逐个进行复制,可以通过迭代实现。
let util = ( ()=> {
// 获取数据类型
let getType=(obj)=> {
let type = Object.prototype.toString.call(obj);
return /object\s(.*)]/.exec(type)[1];
};
let isType=(obj, type)=>{
obj = getType(obj).toLowerCase();
return obj === type;
};
return {
isType: isType
}
})();
// 将obj对象传入,return一个复制后的对象出来
let deepCopy = (obj1) => {
// 若不是对象类型或是null类型,直接输出
if (typeof obj1 !== 'object' || obj1 === null) {
return obj1
}
let i;
// 根据目标是Array类型还是object来设置目标参数的类型
let target = util.isType(obj1, 'array') ? [] : {};
for (i in obj1) {
// 判断当前复制的对象是否为对象类型数据
if (typeof obj1[i] === 'object') {
deepCopy(obj1[i]);
}
target[i] = obj1[i]
}
return target
};
let a1={a:1};
let b1=deepCopy(a1);
console.log(b1); //{ a: 1 }
a1.a=2;
console.log(deepCopy(a1)); //{ a: 2 }
console.log(b1); //{ a: 1 }
可以看出,当源数据发生变化时,深度复制后的数据不会随之改变。
当然也可以用简单点的方法。
let deep=(sourceObj)=>{
return JSON.parse(JSON.stringify(sourceObj))}