对象数组赋值给另一个数组,在操作新数组,怎么使原数组不变

var c = self.threeData1;
                                        var threeData2 = c.concat();
                                        
                                         threeData2.forEach(function(iten){
                                            iten.price = "---"
                                         })
                                       console.log("c",c)
                                       console.log("threeData2",threeData2)
阅读 10.5k
5 个回答

因为对象赋值,他们指向的是同一个应用,所以会改变。

  1. 原数组treeData1中的元素都是object,也就是引用类型。
  2. concat方法是合并两个数组,类似将object1赋值给object2,此时对object1的属性a进行修改,此时object2a属性与object1的a属性值相同。

所以修改了第一个数组中某个元素的属性,新数组中对应元素属性也被修改。

总结起来就是值类型数据和引用类型数据的拷贝/克隆问题。
引用类型数据赋值时,是赋值此对象的指针,而并不是存储在堆中的对象。

深拷贝了解一下,可以使用JSON.parse(JSON.stringify(arr))实现深拷贝,方法的弊端可以自己去了解下

数组赋值的时候,用lodashcloneDeep方法。

var arr2 = cloneDeep(arr1)

或者其他可以深拷贝的方法:
https://segmentfault.com/a/11...

归根结底,就是数组直接赋值的时候,新数组和原数组的地址会指向同一块内存地址,所以改原数组,新数组也会改。

推荐问题
宣传栏