使用splice删除数组重复项时为何两个数组会同时被修改?
问题原因
你代码中的let ArrayCopy = MainArray没有生成独立的数组副本,本质是给同一个数组绑定了两个不同的变量名。
在JavaScript中,数组属于引用类型,变量存储的是数组在内存中的引用地址,赋值操作只会拷贝这个地址,不会在内存中生成新的数组。也就是说MainArray和ArrayCopy指向的是完全相同的数组,你对ArrayCopy调用splice删除元素,相当于直接修改MainArray对应的数组,所以两者的长度会同步变化。
修复方案
如果需要创建独立的数组副本,仅修改副本不影响原数组,可以用以下任意一种方式实现数组浅拷贝(你的场景仅需要删除数组元素,不需要修改元素内部属性,浅拷贝完全够用):
- 使用扩展运算符:
let ArrayCopy = [...MainArray] - 使用
slice方法:let ArrayCopy = MainArray.slice() - 使用
Array.from方法:let ArrayCopy = Array.from(MainArray)
额外优化建议
你当前的需求是避免重复配对,其实不需要额外维护一个拷贝数组,只要把内层循环的起始下标从0改成i+1即可:内层循环永远只遍历当前外层元素之后的内容,天然不会出现A匹配B和B匹配A的重复结果,逻辑更简洁。
内容的提问来源于stack exchange,提问作者DevNick
相关产品推荐
相关产品推荐

