深度克隆对象【前端每日一题-19】

376 阅读1分钟

深度克隆对象的方法有哪些?并把你认为最好的写出来。

此题不多说,必须掌握,工作中经常需要用到。

JSON.stringify

很明显可以看到输出的对象中没有say方法和undefined属性,所以JSON.stringify有一定的局限性,但是对于接口交互中还是挺实用的。

let obj = {
  name: 'liming',
  age: 12,
  parents: {
    mother: { name: 'zhanglan', age: 34 },
    father: { name: 'lifeng', age: 35 }
  },
  score: [1, 2, 3, 4, 5, 6],
  say: function() {
    console.log('my name is ' + this.name);
  },
  null: null,
  undefined: undefined
};

console.log(JSON.parse(JSON.stringify(obj)));

深度递归

此方法需掌握,递归遍历对象并赋值。

注意点:数组需要特殊处理,不然复制过来就变成了一个类数组格式。

function deepClone(value) {
  if (Object.prototype.toString.call(value) === '[object Object]') {
    //对象
    let returnObj = {};
    for (let key in value) {
      returnObj[key] = deepClone(value[key]);
    }
    return returnObj;
  } else if (Object.prototype.toString.call(value) === '[object Array]') {
    //数组
    let returnArr = [];
    for (i = 0, len = value.length; i < len; i++) {
      returnArr.push(deepClone(value[i]));
    }
    return returnArr;
  }
  return value;
}