为什么JS中使用splice修改数组会影响所有引用该数组的变量?
问题原因解释
这是JavaScript引用数据类型的特性导致的:
- 数组属于引用类型,你代码中
arr、arrayBase、arrayData三个变量存储的不是数组本身的内容,而是同一个数组在堆内存中的存储地址,三个变量都指向同一个数组实例。 splice是会直接修改原数组的方法,你通过arrayData调用splice时,本质是修改了堆内存中共享的数组实例,所以所有指向该地址的变量(包括arrayBase、arr)读取到的内容都会同步变化。
修正方案
如果要让arrayBase和arrayData成为互不影响的独立数组,需要对原数组做浅拷贝再赋值,常用写法有以下几种:
- 展开运算符写法
const arrayBase = [...arr] let arrayData = [...arr]
- 数组slice方法写法
const arrayBase = arr.slice() let arrayData = arr.slice()
- Array.from静态方法写法
const arrayBase = Array.from(arr) let arrayData = Array.from(arr)
另外你的代码还存在几处可修正的问题:
- 累加变量
x没有赋初始值,直接累加会得到NaN,需要改为let x = 0 - 最小值判断逻辑写反,当前
if(min<x)和最大值判断逻辑一致,需要改为if(x < min),同时min的初始值建议设为无穷大let min = Infinity - 未声明的
arrayDataabc直接赋值会自动成为全局变量,建议先声明再使用
内容的提问来源于stack exchange,提问作者Gerry
相关产品推荐
相关产品推荐

