浅拷贝
以赋值的形式拷贝引用对象,新对象只是原对象的一个引用,修改新对象时原对象也会受到影响
深拷贝
完全拷贝一个新对象,是“值”而不是“引用”,修改新对象时原对象不再受到任何影响
拷贝所有层级的对象属性和数组元素:
- 利用JSON
let newObj = JSON.parse(JSON.stringify(oldObj))
- Lodash
let newObj = _.cloneDeep(oldObj)
- 递归进行逐一赋值
function deepCopy(oldObj) {
var newObj = oldObj.instanceof Array ? [] : {}
for (var item in oldObj) {
if (typeof oldObj[item] === "object") {
newObj[item] = deepCopy(oldObj[item]);
} else {
newObj[item] = oldObj[item];
}
}
return obj;
}
仅“深”拷贝第一层级的对象属性或数组元素,更深层次的拷贝是浅拷贝:
- ES6的拓展运算符…(三点运算符)
let newObj = {...oldObj}
- ES6的Object.assign()
let newObj = Object.assign({}, oldObj)
案例
// 拷贝第一层级
let oldObj = { type: 'oldObj' };
let newObj = { ...oldObj };
newObj.type = 'newObj';
console.log(oldObj); // {type: 'oldObj'} // 不随着newObj的改变而改变
console.log(newObj); // {type: newObj'}
// 对象值为引用类型时,拷贝多层级,引用类型进行深拷贝也只是拷贝了引用地址
let oldObj = { obj: { type: 'oldObj' } };
let newObj = { ...oldObj };
newObj.obj.type = 'newObj';
console.log(oldObj); // { obj: { type: 'newObj' } } // 随着newObj的改变而改变
console.log(newObj); // { obj: { type: 'newObj' } }