1、数组的直接赋值属于数组的浅拷贝,JS存储对象都是存内存地址的,所以浅拷贝会导致新数组和旧数组共用同一块内存地址,其中一个数组变化,另一个数组也会相应的变化。
var a =[1,2,3];var b=a;a[0]=30;console.log(a,b);
结果: [30, 2, 3] [30, 2, 3]
2、数组内部不含有引用类型,使用slice() 、concat() 和 assign() 方法都属于数组的深拷贝,一个数组变化,另一个数组不受影响。
数组的concat方法
var a=[1,2,3];var b=[].concat(a); a[0]=30;console.log(a,b);
结果:[30, 2, 3] [1, 2, 3]
使用es6的展开操作符: …arr
var a=[1,2,3];var b=[].concat(a); var c=[...a]; a[0]=30;console.log(a,b,c);
结果:[30, 2, 3] [1, 2, 3] [1, 2, 3]
利用split join map方法
let arr1=[1,2,3];var newArr4 = arr1.join(" ").split(" ").map(function(i){return parseInt(i);}); arr1[0]=30;console.log(arr1,newArr4);
VM1175:1 (3) [30, 2, 3] (3) [1, 2, 3]
3、数组内部含有引用类型,使用slice() 、concat() 和 assi