原文地址飞机
浅拷贝:只拷贝第一层
深拷贝:比如Object.assign()、JSON对象的parse和stringify、JQ的extend,但是它们有一个共同的问题就是对简单对象可以实现深拷贝,但是对复杂对象就不行了,比如这样一个对象(属性值有函数、数组、复杂对象等)
let arr = [
{
proarr: [],
profn:function(a,b){
return a+b
}
}
]
JSON.Pase(会让函数丢失掉!!!)
需要自己写一个函数,这是个对象的!!!!!!数组的自己写,虽然我也没用过,我操作数组,newitem然后push进去
function copyFn(obj) {
if (obj == null) {
return null
}
var result = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
result[key] = copyFn(obj[key]); // 如果是对象,再次调用该方法自身
} else {
result[key] = obj[key];
}
}
}
return result;
}
function deepCopy(params) {
// 如果是数组
if (Array.isArray(params)) {
var res = [];
for (var i = 0; i < params.length; i++) {
if (params[i] instanceof Object) {
// 将深层拷贝的结果的 添加到 res 中
res.push(deepCopy(params[i]));
} else {
res.push(params[i]);
}
}
return res;
}
// 如果是对象 进行 对象的拷贝
if (params.constructor === Object) {
var res = {}; // 1 声明空对象
for (var x in params) {
// 遍历被拷贝独享
// 如果你是数组或者对象;需要再次拷贝
if (params[x] instanceof Object) {
// 将深层拷贝的结添加到 res中
res[x] = deepCopy(params[x]);
} else {
// params[x] 为基本类型数据 直接添加大res中
res[x] = params[x];
}
}
return res
}
}