1、深浅拷贝
- 浅拷贝:只复制第一层,内部引用类型不复制,仍指向原对象;
const obj1 = { name: '张三', info: { age: 18 } };
const obj2 = { ...obj1 };
obj2.name = '李四';
obj2.info.age = 20;
console.log(obj1.info.age);
- 深拷贝:递归复制所有层级,两个对象完全独立互不影响
const obj1 = { name: '张三', info: { age: 18 } };
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.info.age = 20;
console.log(obj1.info.age);
- 浅拷贝常见的方法:
Object.assign({}, obj)、...(ES6 扩展运算符)、Array.prototype.slice() / concat() 对数组浅拷贝;
- 深拷贝常见的方法:
- JSON.parse(JSON.stringify(obj)):简单易用,不支持函数、undefined、Symbol、循环引用;
- lodash.cloneDeep(obj):功能强大,可靠,需要引入库;
- 手写递归:灵活但实现复杂,容易遗漏边界情况;
2、深浅比较
- 浅比较:浅比较比较的是两个值 第一层属性是否相等,如果是引用类型(对象/数组),就比较它们的 引用地址是否一样。
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { a: 1, b: { c: 2 } };
obj1 === obj2;
obj1.a === obj2.a;
obj1.b === obj2.b;
- 深比较:判断两个值是否相等,会递归比较所有嵌套结构的值
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { a: 1, b: { c: 2 } };
obj1 === obj2;
obj1.a === obj2.a;
obj1.b === obj2.b;