常⽤的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);
深拷贝:
定义:
深拷贝就是指完全的拷贝⼀个对象,即使嵌套了对象,两者也相互分离,修改⼀个对象的属性,也不会影响另⼀个。⽅法:
1. 通过JSON.stringify转化成字符串再通过JSON.parse()解析成原数组。
let A = [ { a: 1 }, [ 1, 2 ], 3 ];
let B = JSON.parse( JSON.stringify( A ) );
2、利⽤jQuery的$.extend⽅法。
js合并两个数组
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(),进⾏深拷贝。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。