数组引用的问题

clipboard.png
如图,为什么删除cc的一项后data也会改变,有没有办法删除cc的一项后data不改变

多谢大家,只能采纳一个,对不起了

阅读 3.7k
10 个回答

吼吼...

题主请百度一下javascript深复制和浅复制的问题

浅复制案例代码如下:

const A = {
    a: 1,
}
const B = A

是不是与你的代码如出一辙?

深复制可以通过ES6的Array.from来实现,代码如下:

const arr1=[1,2,3];
const arr2=Array.from(arr1);
arr1.push(4);
alert(arr1);  //1234
alert(arr2);  //123

也可以通过rest扩展运算符(...)实现,但是这个对于多层嵌套的对象有些小问题...暂时不太推荐

var cc = JSON.parse(JSON.stringify(data));
 var cc = [].concat(data)

数组是引用对象,这里的data和cc指向同一个数组对象[1,2,3]。因此操作一个会影响另一个。如果不想互相影响,克隆一个cc即可,var cc = Array.from(data)

你这是浅拷贝,只需变成深拷贝即可

cc 和 data 引用的是同一块内存地址;
要想不变就得clone,数组简单,直接来个 cc = data.map((v)=>{
return v});

你这样写的话,cc其实就是data。

改成如下的写法:

var data = [1,2,3];
var cc = data.concat();

数组是引用传值,而push(),pop(),splice()都是会修改调用的数组。concat()和slice()不会。

var da=[1,2,3]; var c=da.concat(); c.splice(0,1);console.log(da);console.log(c);

用lodash的cloneDeep。。。用完开心又愉快

这个不是赋值,而是将数组data的引用赋给cc,所以改变data也会改变cc;

应该这样:
1、var cc = [].concat(data);
//concat方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。将data与一个空数组连接返回一个新数组,来达到copy的结果
2、var cc=data.slice(0);
//返回一个新数组,从0到最后,该方法不会改变现有的数组。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题