拷贝不要用于对象

浅拷贝:拷贝的是内存地址,不管修改拷贝前或者拷贝后,两者都会改变。

深拷贝:新创建一个对象,使用循环,把拷贝前的每一项拷贝给新对象,不管修改拷贝前或者拷贝后,两者都不会受影响。



// 基本类型:String Number Boolean null undefined symbol
// 引用类型: Object(Array function(但函数不可用) Data)
// 深拷贝和浅拷贝适用于引用类型
// 基本类型是存储在栈内存中,引用类型是存储在堆内存中(栈内存中存储的是堆内存中的引用地址)
//浅拷贝 引用类型拷贝的内存地址,只拷贝是一层,
let a = [1, 2, 3]
let b = a;
a[0] = 4;
console.log(b);
// 深拷贝 拷贝所有 深拷贝是新创建一个对象 把需要拷贝的对象中的每一项 拷贝一份 给新对象
var obj = {
name: "rql"
}
var obj2 = {};
for (let i in obj) {
obj2[i] = obj[i];
}
obj.name = "rqy";
console.log(obj);
console.log(obj2);
console.log(obj2.name);

// json格式也是对象
var p = {
"id": "007",
"name": "刘德华",
"books": new Array('三国演义', '水浒传', '西游记')
}
var p2 = {}
for (var key in p) {
if (typeof p[key] == 'object') { //判断是否是引用类型
p2[key] = []; //创建一个新数组,来存储拷贝的数据
for (var i in p[key]) {
p2[key][i] = p[key][i];
}
} else {
p2[key] = p[key]
}
}
p.id = "008";
p2.books[0] = "四国";
console.log(p);
console.log(p2);