为什么city属性加到arr2中的、而sum数组中也有city属性呢?好奇怪、求解释
因为arr2=sum
sum是数组,属于引用数据类型。修改arr2的内容会同时修改sum中的内容。
这是浅拷贝
数组的直接赋值属于数组的浅拷贝,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);
sum是数组
js中对象和数组是按引用地址传递的。
arr2=sum
当把一个数组从一个变量传递到另一个变量中时,两个变量都指向这同一个数组的引用地址。
当对数组的属性赋值时,实际上是先读取变量中的引用地址找到数组,再改变这个数组的属性。
这样之后再用另一个变量中的引用地址所找到的也是这同一个数组,会获取到一样的数组内容。
比如
var a=[1,2,3];
var b=a; //a和b变量都指向同一个的引用地址。
b[1]=6; //当对数组b的属性赋值时,实际上是先读取变量中的引用地址找到数组,再改变b数组的属性。
alert(b); //输出 1,6,3
alert(a); //用另一个变量a中的引用地址所找到的也是这同一个数组,会获取到一样的数组内容。输出 1,6,3
但是这种引用只在读取变量时有效,当对变量重新赋值时,原有的引用就会断开。
b=[5,6,7]; //b变量重新指向一个新对象的引用地址。不会影响到a变量。
alert(b); //输出 5,6,7
alert(a); //还是输出 1,6,3
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!