浅拷贝:
只复制对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意一个的值,另一个也会随之改变,这就是浅拷贝。
1.赋值
var m = {
a: 10,
b: 5,
}
var n = m;
n.a=15;
console.log(m.a)//15
m.a会输出15,因为这是浅拷贝,n和m指向的是同一个堆,对象复制只是复制的对象的引用。
2.遍历对象,复制属性。
var dog = {
//对象的属性仍然是对象,浅拷贝拷贝到的是指针,
指针指的对象一个改变,另一个也随之改变。
run: {
fast: {
a: 'long',
}
},
speak: 'load',
color: 'red',
}
var arr1 = {};
function Cope(obj) {
for (var i in obj) {
arr1[i] = obj[i]
}
return arr1;
}
var arr2 = Cope(dog);
arr2.run.fast = 'pink';
console.log(dog.run.fast); //pink
深拷贝:
将对象和值复制过来,两个对象修改其中任意一个的值,另一个不会改变,这就是深拷贝。
1.递归复制
var dog = {
run: {
fast: {
a: 'long',
}
},
speak: 'load',
color: 'red',
}
function deepCope(obj) {
var arr1 = {};
//遍历对象
for (var i in obj) {
//判断对象的属性是否是他本身所拥有的,而非继承过来的。
if (obj.hasOwnProperty(i)) {
//如果对象的属性仍是对象并且不为空,复制obj属性。
if (typeof obj[i] === "object" && obj[i] != null) {
arr1[i] = deepCope(obj[i]);//递归,参数:是对象的属性。
} else {
arr1[i] = obj[i];
}
}
}
return arr1;
}
var arr2 = deepCope(dog);
arr2.run='pink';//改变其中一个的属性,另一个不会改变。
console.log(dog.run);//Object
console.log(arr2===dog) //false
2.JOSN
用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象
(函数不可以)
var dog = {
run: {
fast: {
a: 'long',
}
},
speak: 'load',
color: 'red',
}
var a = JSON.parse(JSON.stringify(dog));
a.run='pink'; //改变其中一个的属性,另一个不会改变。
console.log(dog.run);
console.log(a===dog) //false
3.jquery
var dog = {
run: {
fast: {
a: 'long',
}
},
speak: 'load',
color: 'red',
}
var a = $.extend(true, {}, dog);
a.run = 'pink'; //改变其中一个的属性,另一个不会改变。
console.log(dog.run);
console.log(a===dog) //false