javascript对象拷贝

9,740 阅读1分钟

一:浅拷贝

浅拷贝方法一:

使用:var newObj = Object.assign({}, obj1)
原理:Object.assign()方法用于将一个或多个对象的可枚举属性复制到目标对象

实例:

该实例中,对象obj被合并到第一个参数{}中,并将合并后的结果返回

要注意,如果此时,第一个参数已经变成了合并后的结果:

浅拷贝方法二:

使用:var newObj = Object.create(obj)

原理:创建一个新对象,并使用当前对象的_proto_

浅拷贝方法三:

使用:Array.prototype.concat()

原理:利用数组的拼接功能,将多个数组拼接后的结果返回

浅拷贝方法四:

使用:Array.prototype.slice()

原理:利用数组的截取功能,将多个数组拼接后的结果返回

二:深拷贝

深拷贝方法一:

使用:var newObj = JSON.parse(JSON.stringify(obj))

原理:先序列化,再反序列化

深拷贝方法二:

终极方法:www.cnblogs.com/buxiugangzi…

   function  deepClone(data) {
      const type = this.judgeType(data);
      let obj;
      if (type === 'array') {
        obj = [];
      } else if (type === 'object') {
        obj = {};
      } else {
    // 不再具有下一层次
        return data;
      }
      if (type === 'array') {
        // eslint-disable-next-line
        for (let i = 0, len = data.length; i < len; i++) {
          obj.push(this.deepClone(data[i]));
        }
      } else if (type === 'object') {
        // 对原型上的方法也拷贝了....
        // eslint-disable-next-line
        for (const key in data) {
          obj[key] = this.deepClone(data[key]);
        }
      }
      return obj;
    }

   function  judgeType(obj) {
     // tostring会返回对应不同的标签的构造函数
      const toString = Object.prototype.toString;
      const map = {
        '[object Boolean]': 'boolean',
        '[object Number]': 'number',
        '[object String]': 'string',
        '[object Function]': 'function',
        '[object Array]': 'array',
        '[object Date]': 'date',
        '[object RegExp]': 'regExp',
        '[object Undefined]': 'undefined',
        '[object Null]': 'null',
        '[object Object]': 'object',
      };
      if (obj instanceof Element) {
        return 'element';
      }
      return map[toString.call(obj)];
    }

深拷贝方法三: 函数库lodash

该函数库提供了 _.cloneDeep  实现深拷贝。

var _ = require('lodash');
var obj1 = {
   a: 1,
   b: { name: { g: 1 } },
   c: [1, 2, 3]
};
var obj2 = _.cloneDeep(obj1);
console.log(obj1.b.name === obj2.b.name);  // false