这里涉及到了数组的深拷贝和浅拷贝。
浅拷贝,两个数组会相互影响
var arr1=[1];
var arr2=arr1;
arr2[1]=2;
console.log(arr1);// [1, 2]
console.log(arr2);// [1, 2]
上面的例子中。我只是改变了arr2里面的值。但是arr1的值竟然也随之改变了。
想要实现arr2的值改变不影响arr1就得进行深拷贝。切断两个数组之间的关联。使用扩展运算符...进行复制。或者是用concat
或者slice
赋值。
使用扩展运算符需要es6语法的支持。
var a = ['1','2','3']
var b = [...a];
b[3]="4";
console.log(b);//["1", "2", "3", "4"]
console.log(a);//["1", "2", "3"]
b的改变不会影响a
var arr1=[1];
var arr2=arr1.concat([]);//或者是var arr2=arr1.slice();
//上面的情况深拷贝以后。arr2==arr1.是true。也可以使用var arr4=arr1.concat();arr4也深拷贝了arr1.并且arr1!=arr4不改变原来数组的情况下,拷贝出数组 b ,且满足 b!=a。使用concat()
arr2[1]=3;
console.log(arr1);//[1]
console.log(arr2);//[1, 3]
sort()对数组进行排序也会影响到原来的数组。即使你只用在判断里面
var arr1=[3,1];
var arr2=[1,3];
if(arr1.sort().toString()==arr2.sort().toString()){
console.log("00000")
}
console.log(arr1);//[1, 3]
console.log(arr2);//[1, 3]
发现即使你用了sort判断也会改变原来的数组的顺序的。
Object.assign()拷贝
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
jq的$.extend([true/false],目标对,拷贝的对象)- true的话是深拷贝,false浅拷贝会改变原来的值