怎么解释深拷贝和浅拷贝?
简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。常见的浅拷贝有哪些?
1. ...运算符let obj={name:'jack',address:'shanghai'}let o = {...obj};obj.name = 'hello';console.log(o); //=>{name: "jack", address: "shanghai"}复制代码
这个看起来有点像深拷贝是不是? 别急再来一点变化。
let obj={name:'jack',address:{city:'shanghai',num:1}}let o = {...obj};obj.name = 'hello';obj.address.city='beijing'console.log(o); //{name: "jack", address:{city: "beijing",num: 1}}复制代码
所以我们知道深拷贝不仅仅是一维不影响并且朵唯也不影响。所以...运算符是浅拷贝;
2.slice/concat 这两个方法和1是一样的 一维的时候是深拷贝 但是多维是浅拷贝
如果实现深拷贝?
1.Json.parse 和json.stringify(); 功能不完整 不能实现复杂的拷贝 例如函数。 2.递归拷贝function deepClone(obj){ if(obj == null) return obj; if(obj instanceof Date) return new Date(obj); if(obj instanceof RegExp) return new RegExp(obj); if(typeof obj !=='object') rerurn obj; let cloneObj = new obj.constructor; //找到数组或者对象的原型; for(let key in obj){ if(obj.hasOwnPrototype(key){ //实现递归拷贝 cloneObj[key] = deepClone(obj[key]); } } return cloneObj; }let obj = {name:1,address:{name:'shanghai',num:1}};复制代码