深拷贝浅拷贝的方法
浅拷贝
//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 } */复制代码