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")