常用的js数组复制(浅拷贝,深拷贝)

浅拷贝:
定义:
数组的直接赋值属于数组的浅拷贝,JS存储对象都是存内存地址的,所以浅拷贝会导致新数组和旧数组共用同一块内存地址,其中一个数组变化,另一个数组也会相应的变化。
数组内部不含有引用类型,使用slice() 、concat() 和 assign() 方法都属于数组的深拷贝,一个数组变化,另一个数组不受影响。
数组内部含有引用类型,使用slice() 、concat() 和 assign() 方法,非引用类型的值属于深拷贝,引入类型的值属于浅拷贝,一个数组变化,另一个也会相应的变化。
方法:
for循环
数组的concat方法
         concat() 方法用于连接两个或多个数组。

         该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。

使用es6的展开操作符:    …arr
利用split join map方法

var arr = [0,1,2,3,4,5,6];
 
//方法1:for循环
var newArr1 = [];
for (var i = 0; i < arr.length; i++) {
  newArr1.push(arr[i]);
}
console.log(newArr1); //ok [0,1,2,3,4,5,6]
//方法2:数组的concat方法
var newArr2 = [].concat(arr);
console.log(newArr2);
//方法3:使用ES6的展开操作符
var newArr3 = [...arr];
console.log(newArr3);
//方法4:字符串的split 数组的join方法:
var newArr4 = arr.join(" ").split(" ").map(function(i){return parseInt(i);});
console.log(newArr4);
//方法5:Object.assign()
let A = [ 1, 2, 3 ]
let B = Object.assign( [], A );
console.log(B);
//方法4: slice()
//  arrayObject.slice(start,end),该方法返回一个新的数组,
//包含从 start 到 end (不包括该元素)的 arrayObject 中的元素
let A = [ 1, 2, 3 ]
let B = A.slice(0);


深拷贝:
定义:
深拷贝就是指完全的拷贝一个对象,即使嵌套了对象,两者也相互分离,修改一个对象的属性,也不会影响另一个。

方法:
通过JSON.stringify转化成字符串再通过JSON.parse()解析成原数组。

let A = [ { a: 1 }, [ 1, 2 ], 3 ]; 
let B = JSON.parse( JSON.stringify( A ) );


     2、利用jQuery的$.extend方法。

$.extend( [deep ], target, object1 [, objectN ] );

deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
object1  objectN可选。 Object类型 第一个以及第N个被合并的对象。

let A = [ { a: 1 }, [ 1, 2 ], 3 ]; 
let B = $.extend( true , [] , A ); // 默认为false,是浅拷贝,true为深拷贝


3、拷贝的时候判断属性值的类型,如果是对象,继续递归调用深拷贝函数。

var deepCopy = function(obj) {
  // 只拷贝对象
  if (typeof obj !== 'object') return;
  // 根据obj的类型判断是新建一个数组还是一个对象
  var newObj = obj instanceof Array ? [] : {};
  for (var key in obj) {
    // 遍历obj,并且判断是obj的属性才拷贝
    if (obj.hasOwnProperty(key)) {
      // 判断属性值的类型,如果是对象递归调用深拷贝
      newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
    }
  }
  return newObj;
}


4、或者借助插件函数:_.cloneDeep(),进行深拷贝。
————————————————
版权声明:本文为CSDN博主「年轻即出发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42246997/article/details/107341725

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值