2022-09-18笔试题00
请注意,本文编写于 579 天前,最后修改于 579 天前,其中某些信息可能已经过时。

面试高频手撕代码题

深拷贝 浅拷贝

  • 浅拷贝

浅拷贝是指把一个对象 obj 的属性值直接拷贝给另一个对象,其中包括了原始类型的值,还有引用类型的内存地址

// 方法1:原生的Object.assign(target, src)方法来实现浅拷贝
let obj = {
  name: 'Lee',
  age: 18,
  gf: {
    name: 'Yjj',
    age: 18,
  },
};
let newObj = Object.assign({}, obj);
obj.gf.age = 25;
console.log(newObj); // {"name":"lee","age":18,"gf":{"name":"yjj","age":25}}
// 注意这个方法target对象是第一个参数
// 方法2:扩展运算符(也是浅拷贝)
let obj1 = {
  name: 'Lee',
  age: 18,
};
let newObj1 = { ...obj };
obj1.age = 25;
console.log(newObj1); // {name: "Lee", age: 18}

// 对象里面有对象
let obj2 = {
  name: 'Lee',
  age: 18,
  gf: {
    name: 'Yjj',
    age: 18,
  },
};
let newObj2 = { ...obj2 };
obj2.gf.age = 25;
console.log(newObj2); // {"name":"lee","age":18,"gf":{"name":"yjj","age":25}}
// 方法3:函数法
function shallowClone(obj) {
  if (!obj || typeof obj !== 'object') return;
  let newObj = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = obj[key];
    }
  }
  return newObj;
}
  • 深拷贝

一行代码:

let newObj = JSON.parse(JSON.stringify(oldObj));

函数:

function deepClone(obj) {
  if (!obj || typeof obj !== 'object') return;
  let newObj = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key];
    }
  }
  return newObj;
}

// test
let obj = {
  age: 1,
  jobs: {
    first: 'FE',
  },
  schools: [
    {
      name: 'shenda',
    },
    {
      name: 'shiyan',
    },
  ],
  arr: [
    [
      {
        value: '1',
      },
    ],
    [
      {
        value: '2',
      },
    ],
  ],
};
console.log(deepClone(obj));

本文作者:前端小毛

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!