concat是会将前后两个数组如果是同一个变量listchild,那么在新数组中的两个listChild会不会指向同一块内存
listChild=[{...}]
let list = listChild.concat(listChild);
先说结论,concat是会将前后两个数组拷贝,然后返回一个新数组,虽然新数组是一块新内存,但是如果前后两个数组是同一个变量listchild,那么就会出现再新数组list中的,两个listchild实际上是指向同一块内存。
由于将js的数组赋值给变量,实际上是赋值的数组引用,所以当concat(listChild)时,编译器申请了一块新的内存空间,用于存储listChild中可枚举的属性的副本(可枚举属性下面会讲),然后listChild.concat时,由于listChild已经创建了副本,所以直接返回了该副本的引用,并不新申请内存,导致结果如下图:

最终导致操作list[0]时,list[1]会跟着一起变
有api可以验证这个问题,我们可以使用 Object.is 函数来比较两个对象是否是同一个对象,它会比较两个对象的内存地址是否相同。
console.log(,Object.is(list[0],list[1]))
//结果为true
解决方案:
既然两个listchild指向同一块内存,那就深拷贝一个listchild,也就是多申请一块内存,使两个listchild各自指向单独的内存,那么在最终的list中就不会出现指向同一内存的问题了
listChild=[{...}]
let list = listChild.concat(JSON.parse(JSON.stringify(listChild)));
JSON.parse(JSON.stringify(obj))只是其中一种深拷贝的方式,也可以选用其他方式
文章讨论了JavaScript中concat方法在处理同一数组变量时,可能会导致新数组内的元素引用同一内存块的问题。当修改新数组的一个元素时,另一个也会随之改变。通过Object.is函数验证了这一点。解决方案是使用深拷贝,如JSON.parse(JSON.stringify()),以确保两个数组元素在新数组中分别指向独立的内存空间。
863

被折叠的 条评论
为什么被折叠?



