1.浅拷贝
- 浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象
既传值也传址
var arr =[1,2,3];var b = arr;b.push(4);console.log(arr);
2.深拷贝
深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响
-
1.如果对象中的属性是简单数据类型,实现深拷贝
{...obj}Object.assign()<script>var obj ={name:"li",age:18}// var a={...obj}; 实现深拷贝//也可以用var a =Object.assign({},obj)obj.id=100 //添加不会影响原来数组或对象结构console.log(a);</script>
var arr = [{name:"cheng"},{name:"zhang"},{name:"li"}];var res = [...arr];res[0].name="huang";res.push({name:"vue"});console.log(arr);
2.遇到复杂类型(array+object)
var obj = {name:{name:"cheng"}};function deepClone(obj){/* 1.能够识别数组和对象了 */let result;if(typeof obj=="number" || obj == null || typeof obj=="boolean"||typeof obj=="string"){return obj;}if(obj instanceof Array || typeof obj == "object"){/* 2.对拷贝的值作初始值得设定 */if(obj instanceof Array){result = [];}else if(typeof obj =="object"){result = {};}/* 3.需要将obj克隆到result中 */for(let key in obj){result[key] = deepClone(obj[key]);}return result;}}var res = deepClone(obj);console.log(res)/*result = {name:deepClone({name:"cheng"})}result = {name:{name:deepClone("cheng")}}result = {name:{name:"cheng"}}*/console.log(typeof "fd")
