面试备战录

52 阅读1分钟

1、深浅拷贝

  • 浅拷贝:只复制第一层,内部引用类型不复制,仍指向原对象;
const obj1 = { name: '张三', info: { age: 18 } };
const obj2 = { ...obj1 }; // 浅拷贝

obj2.name = '李四'; // ✅ 不影响 obj1
obj2.info.age = 20; // ❗ 改变了 obj1 的 info.age!
console.log(obj1.info.age); // 20 ❗
  • 深拷贝:递归复制所有层级,两个对象完全独立互不影响
const obj1 = { name: '张三', info: { age: 18 } };
const obj2 = JSON.parse(JSON.stringify(obj1)); // 简单的深拷贝方法

obj2.info.age = 20;
console.log(obj1.info.age); // 18 ✅
// obj1 和 obj2 完全断开了关系。
  • 浅拷贝常见的方法: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 } }; // 结构一样,但 b 是不同的对象引用

obj1 === obj2; // false(引用不一样)
obj1.a === obj2.a; // true(值一样)
obj1.b === obj2.b; // false(引用不一样)
  • 深比较:判断两个值是否相等,会递归比较所有嵌套结构的值
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { a: 1, b: { c: 2 } }; // 结构一样,但 b 是不同的对象引用

obj1 === obj2; // false(引用不一样)
obj1.a === obj2.a; // true(值一样)
obj1.b === obj2.b; // true(值一样)