<script>
/*
浅拷贝:拷贝基本数据类型时,不受任何影响,
当拷贝引用类型时,源对象也会被修改。
深拷贝:就是完完全全拷贝一份新的对象,
它会在内存的堆区域重新开辟空间,
修改拷贝对象就不会影响到源对象
*/
var obj1 = {
"a": 1,
"b": 2
};
//浅拷贝
var obj2 = obj1;
obj2.a = 6;
console.log(obj1); //{a: 6, b: 2}源对象也被修改
//对象深拷贝
var obj3 = {};
for (var key in obj1) {
//obj3.a=1
obj3[key] = obj1[key];
}
console.log(obj3); //{a: 6, b: 2}
obj3.b = 888;
console.log(obj3); //{a: 6, b: 888}
console.log(obj1); //{a: 6, b: 2}源对象未被修改
//数组深拷贝
var arr1 = [1, 2, 3];
var arr2;
arr2 = arr1;
arr2[1] = 6;
console.log(arr2); //[1, 6, 3]
console.log(arr1); //[1, 6, 3] 源对象被修改
var arr3 = [];
for (var key in arr1) {
arr3[key] = arr1[key];
}
console.log(arr3); //[1, 6, 3]
arr3[1] = 666;
console.log(arr3); //[1, 666, 3]
console.log(arr1); //[1, 6, 3] 源对象未被修改
</script>
深拷贝方法2
<script>
var obj1 = {
"a": 1,
"b": 2
};
var ary1 = [1, 2, 3];
var obj = {
"a": 1,
"b": 2,
"c": ['hello', 'world'],
"stu": {
'name': 'zs',
"age": 18,
"score": [10, 50, 60]
}
}
//obj可能是数组也可能是对象
function deepCopy(obj) {
var newObj = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (typeof(obj[key]) != "object") {
newObj[key] = obj[key];
} else {
//递归 函数内部调用函数本身
var no = deepCopy(obj[key]);
newObj[key] = no;
}
}
return newObj;
}
var obj2 = deepCopy(obj1);
console.log(obj2);
var ary2 = deepCopy(ary1);
console.log(ary2);
var obj6 = deepCopy(obj);
console.log(obj6);
obj6.stu.score[1] = 100;
console.log(obj6);
console.log(obj);
//深拷贝2
var obj8 = JSON.parse(JSON.stringify(obj));
console.log(obj8);
obj8.c[0] = "祖国统一";
console.log(obj8);
console.log(obj);
</script>