浅拷贝:只是拷贝一层, 更深层次对象级别的只拷贝引用(地址).
深拷贝:拷贝多层, 每一级别的数据都会拷贝.
1.浅拷贝
<script>
//将对象oldobj复制给对象newobj
var oldobj = {
name: '小新',
bestSkills: {
music: '枕边童话',
sport: '羽毛球'
}
};
var newobj = {};
//1.利用for in
for (var k in oldobj) {
// k 是属性名
newobj[k] = oldobj[k];
}
console.log(newobj);
//
</script>
//修改新对象中对象属性的属性值
newobj.bestSkills.music = '大鱼';
console.log(newobj);
console.log(oldobj);
原因:
浅拷贝 对 属性值为 特殊数据类型的 对象 来说 复制的是地址,所以指向的是同一块内存空间。
ps:利用es6新增方法Object.assign(target, source)也可实现浅拷贝
Object.assign(newobj, oldobj);
2.深拷贝
<script>
//将对象oldobj复制给对象newobj
var oldobj = {
name: '小新',
bestSkills: {
music: '枕边童话',
sport: '羽毛球'
},
friends: ['danny', 'liming']
};
var newobj = {};
// 封装函数
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(newobj, oldobj);
console.log(newobj);
</script>
newobj.bestSkills.music = '大鱼';
console.log(newobj);
console.log(oldobj);
原因:
深拷贝拷贝多层。