深拷贝浅拷贝的方法
浅拷贝
//Object 方法
object.assign(target,source)// 将源拷贝到目标,切返回目标
es6 扩展运算符
//数组方法:
slice ,concat,es6扩展运算符
复制代码
深拷贝的两个方法
- JSON序列化
let obj = {a:2,b:{c:1}}
let str = JSON.strify(obj)
JSON.parse(str);
复制代码
JSON 存在几个问题,没法转化 是Date、Function、RegExp,不相信的同学可以试试,对象中有这几个类型的值,拷贝不出来 2.深层递归
function deepClone (obj){
let cloonObj = {};
let ary = [];
if(typeof obj !== "object"){
return obj;
}
if(obj instanceof Array){
for(let val of obj ){
if(typeof val === "object"){
ary.push(deepClone(val));
}else {
ary.push(val);
}
}
return ary;
} else {
for(let key in obj){
if( obj[key] instanceof Object){
cloonObj[key] = deepClone(obj[key]);
} else {
cloonObj[key] = obj[key];
}
}
return cloonObj;
}
}
复制代码
上面代码 只因为 判断是数组还是Object,写的很冗余,精简一下 得到 如下
注意 注意 史上最简短的深拷贝代码来了
function deepClone (obj){
let t = new obj.constructor
if(obj instanceof Date) return new Date(obj);
if(obj instanceof RegExp) return new RegExp(obj);
if(typeof obj !== "object") return obj;
for(let key in obj){
t[key] = deepClone(obj[key]);
}
return t;
}
复制代码
验证下:
let obj = {a:1,b:{c:2},d:[1,2],e:new RegExp(/\d+/),f:function(){console.log(1)},g:new Date()}
let ObjCloone = deepClone(obj)
console.log(ObjCloone);
/*>>{ a: 1,
b: { c: 2 },
d: [ 1, 2 ],
e: /\d+/,
f: [Function: f],
g: 2018-10-02T10:15:19.672Z }
*/
复制代码