const obj = {

  a: 'hello',

  b: {

    a: 'hello',

    b: 'world'

  },

  c: ['good', 'good','study'],

  d: function() {

    console.log('hello world')

  }

}

对象的浅拷贝

方法一:(for in循环)

function simpleCopy (data) {

  let newObj = {};

  if (data) {

    for (let i in data) {

      newObj[i] = data[i]
    }
    return newObj;
  }

}

const newObj = simpleCopy(obj);

newObj.b.a = 'newObj';

console.log(obj.b.a)         // 返回 {a: 'newObj',b: 'world'}

方法二:

const newObj = new assign({},obj);

以上的两种方法在拷贝对象的时候,都存在以下的不足:

缺点:当对象的value为对象时,被拷贝的对象的值发生变化时,原先对象的值也会发生变化

对象的深拷贝

方法一:

function deepCopy (obj) {

  let newObj  = {};

  if (obj) {

    newObj = JSON.parse(JSON.stringify(obj));
  }

  return newObj;

}

缺点: 当对象的value为函数的时候,这个方法无法解析

方法二:

function deepCopy(initObj, finalObj) {

  let obj = finalObj || {};

  if (obj) {

    for (let i in initObj) {

      if (initObj[i] === obj) {   // 避免相互引用出现的死循环

        continue;
      }
      if (typeof initObj[i] === 'object') {

        obj[i] = (initObj[i].constructor === Array) ? [] : {};
        arguments.callee(initObj[i], obj[i])
      } else {

        obj[i] = initObj[i]
      }
    }
    return obj;
  }

}

注: 比较理想的方法