对象和数组的浅复制和深复制

概述

之前踩过一些复制的坑,现在总结一下记录下来,供以后开发时参考,相信对其他人也有用。

对象的浅复制和深复制

浅复制:一般用Object.assign,如果支持es6的话也可以用新语法

const obj = {
    a : 1,
    b : 4
};

//可以用Object.assign
const obj2 = Object.assign({}, obj1);

//es6的解构
const obj2 = { ...obj };

//其实下面这种写法也可以,但是建议使用上面的写法
const { ...obj2 } = obj;

深复制:建议用JSON.parseJSON.stringify方法。

const obj = {
    a : [2, 4, 6],
    b : 4
};
const obj2 = JSON.parse(JSON.stringify(obj));

在如下2种情况下不要用上面的方法:

  1. 对象太大了。由于性能关系,耗时太长。
  2. 对象不是JSON不变的,也就是说,JSON.parse(JSON.stringify(obj)) != obj。
    碰到这2中情况,还是老老实实用递归吧。

数组的浅复制和深复制

浅复制:有很多种方法,不过一般用slice:

const a = [2, 3, 5];
//下面的b,c,d都实现了浅复制
const b = a.slice();
const c = a.concat();
const d = [ ...a ];

深复制:这个最好用库的方法。

jquery库的浅复制和深复制

使用$.extend方法。

const x = {
    a: 1,
    b: { f: { g: 1 } },
    c: [ 1, 2, 3 ]
};

const y = $.extend({}, x),          //浅复制
      z = $.extend(true, {}, x);    //深复制

其它

复制数组和对象的时候一定要注意是不是浅复制。如果只想深复制数组或对象的部分内容,可以先深复制整个对象,再浅复制得到的对象。(如果要性能的话,也可以看情况手动优化。)

猜你喜欢

转载自www.cnblogs.com/yangzhou33/p/9070111.html