1 浅拷贝
浅拷贝没有真正的拷贝到值,而是拷贝的是地址,一改全改
2数组的浅拷贝
//1.数组的浅拷贝
var arr1 = ["a","b","c",[1,2]];
//a.先声明一个空数组
var arr2 = [];
//b.循环数组,将原有数组中的值一个一个复制到目标数组中
for(var key in arr1){
console.log(key + "--------" +arr1[key]); //下标
arr2[key] = arr1[key];
}
console.log(arr2); //["a", "b", "c", Array(2)] 里面有引用数据类型,下标为3的这个数组,拷贝的是地址,
arr2[3].push(3); //["a", "b", "c", Array(3)]
console.log(arr1); //["a", "b", "c", Array(3)] 下标3的这个数组共用的一个地址,一改全改
2.1 对象的浅拷贝
//2.对象的浅拷贝
var obj1 = {
"name":"梁",
"detail":{
"age":35,
"height":175
}
}
//a.创建一个空对象
var obj2 = {};
//b.循环对象,将原有对象中的值一个一个复制到目标对象中
for(var key in obj1){
obj2[key] = obj1[key];
}
console.log(obj2); //{name: "梁", detail: { "age":35,"height":175}} 里面还有对象,对象只是地址的拷贝
obj2.detail.height = 172;
console.log(obj1);//{name: "梁", detail: { "age":35,"height":175}} 共用一个地址,一改全改
2.2 深拷贝
-
$.extend()实现深拷贝
//2.$.extend(deep,目标对象,被复制的对象) var obj2 = $.extend(true,{},obj1); console.log(obj2); //{name: "梁", detail: {"age": 35,"height": 175}} obj2.detail.height = 172; console.log(obj2);//{name: "梁", detail: {"age": 35,"height": 172}} console.log(obj1);//{name: "梁", detail: {"age": 35,"height": 175}}
-
JSON方法实现深拷贝
//3. 使用JSON方法实现深拷贝 //JSON.stringify(object); //将对象转换成字符串 console.log(JSON.stringify(obj1)); //JSON.parse(str) : 字符串转换为对象 var obj3 = JSON.parse(JSON.stringify(obj1)); console.log(obj3); //{name: "梁", detail: {"age": 35,"height": 175}} obj3.detail.height = 170; console.log(obj1); //{name: "梁", detail: {"age": 35,"height": 175}}
-
js原生封装深拷贝的函数
创建一个空对象,循环将原有数据中的内容一个一个复制到空对象中,如果复制的内容中还是对象,使用递归实现深拷贝
//1.判断对象 function getType(data){ return Object.prototype.toString.call(data).slice(8,-1); } //2.深拷贝 function deepCopy(data){ //a.创建一个空对象,空数组 if(getType(data) == "Array"){ var res = []; }else if(getType(data) == "Object"){ var res = {}; }else{ //如果不是引用数据类型,就不存在浅拷贝,直接返回对应的数值 return data; } //b.循环,循环将原有数据中的内容一个一个复制到空对象中 for(var key in data){ //e.如果复制的值还是引用数据类型,这个数据也需要进行深拷贝 if(getType(data[key]) == "Array" || getType(data[key]) == "Object"){ res[key] = deepCopy(data[key]); }else{ res[key] = data[key]; } } //c.返回创建好的对象 return res; } var arr1 = ["a", "b", "c", [1, 2]]; var arr2 = deepCopy(arr1); console.log(arr2); //["a", "b", "c", [1, 2]]; arr2[3].push(3); console.log(arr2); //["a", "b", "c", [1, 2,3]]; console.log(arr1); //["a", "b", "c", [1, 2]]; var obj1 = { "name": "梁", "detail": { "age": 35, "height": 175 } } var obj2 = deepCopy(obj1) console.log(obj2); //{name: "梁", detail: {"age": 35,"height": 175}} obj2.detail.height = 172; console.log(obj2); //{name: "梁", detail: {"age": 35,"height": 172}} console.log(obj1);//{name: "梁", detail: {"age": 35,"height": 175}}