一 浅拷贝
1.1 浅拷贝的原理:
浅拷贝,指的是创建新的数据,这个数据有着原始数据属性值的一份精确拷贝如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址即浅拷贝是拷贝一层,深层次的引用类型则共享内存地址
1.2 浅拷贝的代码实现:
// 浅拷贝只是拷贝一层, 更深层次对象级别的只拷贝引用.
var obj = {
id: 1,
name: "andy",
msg: {
age: 18,
},
};
var o = {};
for (var k in obj) {
// k 是属性名 obj[k] 属性值
// 在这里遍历的 是obj,所以obj[k]代表的是对象 obj里面的属性值。
// 而对应的 o[k] 是对象o的属性名
o[k] = obj[k];
}
console.log(o);
o.msg.age = 20;
console.log(obj);
二 :深拷贝 2.1 深拷贝原理: 深拷贝拷贝多层, 每一级别的数据都会拷贝,无论是简单数据类型还是简单数据类型都会拷贝出来。 2.2 深拷贝代码实现:
// 深拷贝拷贝多层, 每一级别的数据都会拷贝.
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
},
color: ['pink', 'red']
};
var o = {};
// 封装函数
function deepCopy(newobj, oldobj) {
for (var k in oldobj) {
// 判断我们的属性值属于那种数据类型
// 1. 获取属性值 oldobj[k]
var item = oldobj[k];
// 2. 判断这个值是否是数组
if (item instanceof Array) {
newobj[k] = [];
deepCopy(newobj[k], item)
} else if (item instanceof Object) {
// 3. 判断这个值是否是对象
newobj[k] = {};
deepCopy(newobj[k], item)
} else {
// 4. 属于简单数据类型
newobj[k] = item;
}
}
}
deepCopy(o, obj);
console.log(o);
var arr = [];
console.log(arr instanceof Object);
o.msg.age = 20;
****